码迷,mamicode.com
首页 > 编程语言 > 详细

Python笔记6#面向对象高级编程一

时间:2015-01-29 23:49:22      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:

▲__slots__

当定义一个class并创建了一个class的实例之后,我们可以给该实例绑定任何属性和方法。这就是动态语言的灵活性。

实例代码如下:

#定义一个类Student
>>> class Student(object):
...     pass
...
#创建类Student的一个实例stu1
>>> stu1 = Student()
#给实例绑定一个属性name
>>> stu1.name = michael
>>> stu1.name
michael
#给实例绑定一个属性age
>>> stu1.age = 25
>>> stu1.age
25
#定义set_age()函数作为实例方法
>>> def set_age(self, age):
...     self.age = age
...
#导入MethodType模块
>>> from types import MethodType
#给实例stu1绑定方法set_age()
>>> stu1.set_age = MethodType(set_age, stu1)
#调用实例方法
>>> stu1.set_age(20)
#测试结果
>>> stu1.age
20
#创建类Student的另一个实例stu2
>>> stu2 = Student()
#测试给stu1绑定的属性name和方法set_age()是否可用于stu2
>>> stu2.name
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: Student object has no attribute name
>>> stu2.set_age(22)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: Student object has no attribute set_age
#创建一个类方法,并绑定给类Student
>>> def set_score(self, score):
...     self.score = score
...
>>> Student.set_score = MethodType(set_score, Student)
#测试绑定类Student的方法set_score()是否可用于stu1和stu2
>>> stu1.set_score(98)
>>> stu1.score
98
>>> stu2.set_score(70)
>>> stu2.score
70

实际上,上述代码set_score()可以直接定义在类Student中,但是动态绑定也允许我们在程序运行的过程中,动态给程序加上功能。

如果我们想要限制动态增加的属性,我们可以再定义class的时候定义一个特殊的__slots__变量,来限制该class能添加的属性。

实例代码如下:

>>> class Student(object):
#用tuple定义允许绑定的属性名称
...     __slots__ = (name, age)
...
>>> stu3 = Student()
>>> stu3.name = jack
>>> stu3.age = 22
#测试未绑定的属性score能否添加
>>> stu3.score = 86
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: Student object has no attribute score
#测试__slots__对子类是否起作用
>>> class Firstgrade(Student):
...     pass
...
>>> stu4 = Firstgrade()
>>> stu4.name = david
>>> stu4.age = 12
>>> stu4.score = 90

 

▲Property装饰器

官方文档地址链接:https://docs.python.org/3/library/functions.html?highlight=property#property

@property可以把一个方法变成属性调用。把一个getter方法编程属性,只需加上@property。@*.setter负责把一个setter方法变成属性赋值。

示例代码如下:

class Student(object):
    def __init__(self):
        self._score = None
    
#为属性score增加getter
    @property
    def score(self):
        print(you get the score!)
        return self._score
    
#为属性score增加setter
    @score.setter
    def score(self, value):
        print(you set the score!)
        self._score = value
    
#为属性score增加deleter
    @score.deleter
    def score(self):
        print(you delete the score!)
        del self._score


stu1 = Student()
print(- * 50)
stu1.score = 88
print(- * 50)
print(stu1.score)
print(- * 50)
stu1.score = 92
print(stu1.score)
del stu1.score

执行结果:

--------------------------------------------------
you set the score!
--------------------------------------------------
you get the score!
88
--------------------------------------------------
you set the score!
you get the score!
92
you delete the score!

▲多重继承

在设计类的继承关系时,通常主线都是单一继承下来的。如果需要加入额外的功能,可以通过多重继承来实现。这种设计通常称为Mixin。

示例代码如下:

class Animal(object):
    pass

class Flyable(object):
    def fly(self):
        print(flying...)

#定义一个多重继承的子类
class Eagle(Animal, Flyable):
    pass

Python笔记6#面向对象高级编程一

标签:

原文地址:http://www.cnblogs.com/wddoer/p/4261035.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!