添加方法
- 正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法;
- 还可以尝试给实例绑定一个方法,但是,给一个实例绑定的方法,对另一个实例是不起作用的;
- 为了给所有实例都绑定方法,可以给class绑定方法,给class绑定方法后,所有实例均可调用(需要from types import MethodType)。
限制属性
- 为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的slots变量,来限制该class实例能添加的属性;
- slots定义的属性仅对当前类实例起作用,对继承的子类是不起作用的;
- 除非在子类中也定义slots,这样,子类实例允许定义的属性就是自身的slots加上父类的slots;
- slots本质为一个元组tuple,为类属性。
@property 装饰器
class property(object):
"""
property(fget=None, fset=None, fdel=None, doc=None) -> property attribute
fget is a function to be used for getting an attribute value, and likewise
fset is a function for setting, and fdel a function for del'ing, an attribute. Typical use is to define a managed attribute x:
class C(object):
def getx(self): return self._x
def setx(self, value): self._x = value
def delx(self): del self._x
x = property(getx, setx, delx, "I'm the 'x' property.")
Decorators make defining new properties or modifying existing ones easy:
class C(object):
@property
def x(self):
"I am the 'x' property."
return self._x
@x.setter
def x(self, value):
self._x = value
@x.deleter
def x(self):
del self._x
"""
- 同一属性的三个函数名要相同;
- 函数property的基本功能就是把类中的方法当作属性来访问;
- 利用property装饰器,让成员函数称为只读的,不定义@x.setter即可;
- @property广泛应用在类的定义中,可以让调用者写出简短的代码,同时保证对参数进行必要的检查,这样,程序运行时就减少了出错的可能性。
类型检查
print(issubclass(bool,int))
print(isinstance(3,int))
print(type([])==list)
type()就是一个最实用又简单的查看数据类型的方法。type()是一个内建的函数,调用它就能够得到一个反回值,从而知道想要查询的对像类型信息,但是不能用于继承中类型的判断,只能用于基本类型的判断。
Python 有两个用于继承的函数:
使用isinstance()来检查实例类型:isinstance(obj, int)只有obj.class是int或者是从int派生的类时才为True。
使用issubclass()来检查类的继承: issubclas(bool, int)是True因为bool是int的子类。然而,issubclass(float, int)为False,因为float不是int的子类。
多重继承
class DerivedClassName(Base1, Base2...MixIn1,MixIn2...):
<statement-1>
.
.
.
<statement-N>
对于大多数用途,在最简单的情况下,你可以认为继承自父类的属性搜索是从左到右的深度优先搜索,不会在同一个类中搜索两次,即使层次会有重叠。因此,如果在DerivedClassName中找不到属性,它搜索Base1,然后(递归)基类中的Base1,如果没有找到,它会搜索base2,依此类推。通过多重继承,一个子类就可以同时获得多个父类的所有功能。
MixIn的目的就是给一个类增加多个功能,这样,在设计类的时候,我们优先考虑通过多重继承来组合多个MixIn的功能,而不是设计多层次的复杂的继承关系。这样一来,我们不需要复杂而庞大的继承链,只要选择组合不同的类的功能,就可以快速构造出所需的子类。
- 但通常混入 Mixin 的类和 Mixin 类本身不是 is-a 的关系,混入 Mixin 类是为了添加某些(可选的)功能。自由地混入 Mixin 类就可以灵活地为被混入的类添加不同的功能。作为Mixin类,需要满足以下条件:
不能单独生成实例对象,属于抽象类;不能继承Mixin以外的类!
因为有以上限制,Mixin类通常作为功能模块使用,在需要该功能时“混入”,而且不会使类的关系变得复杂(比如,同名方法到底从哪个父类继承)。