一个类基本就是一个命名空间。当python执行class语句(不是调用类)时,会从头至尾执行其主体内的所有语句。该过程中的赋值运算会在这个类作用域中创建名称,从而成为对应的类对象内的属性。因此,类既像模块也像函数:
1、像函数一样,由class语句中内嵌的赋值语句创建的名称,位于class的局部作用域中。
2、像模块内的名称,在class语句中赋值的名称会成为类对象中的属性。
class是复合语句,class语句内的赋值语句会创建数据属性,内嵌的def则会创建方法属性。
一般来说,在一个class语句顶层的任何类型的名称赋值都会在生成的类对象中创建同名的属性。(可通过类名来修改它,或通过实例或类引用它)
继承搜索只会在属性引用时发生,而不是在赋值运算时发生。
class Super:
def init(self,x):
self.x = x
class Sub(Super):
def init(self,x,y):
Super.init(self,x) //显式调用父类的__init__函数(通过类名调用)
self.y = y
I = Sub(1,2)
属性树的构造
1、实例属性是由方法内的self属性进行赋值运算而产生的
2、类属性是通过class语句内的语句(赋值语句)而创建的
3、父类的连接是通过class语句首行的括号内列出的类而产生的
继承
1、子类通过定义与父类相同名称的属性来完全代替继承的属性
2、可以在被覆盖的方法中调用父类方法来扩展父类方法。
父类名.属性
抽象父类:类的部分行为预期由其子类来提供。
class Super:
def delegate(self):
self.action()
def action(self):
raise NotImpementedError('action must be defined!')
#X = Super()
#X.delegate() #需要在子类中重新定义action方法
class Provider(Super):
def action(self):
print(‘in provider.action’)
x = Provider()
x.delegate()
以上抽象父类(抽象基类),需要由子类填充的方法,也可以用特殊的类语法来实现。
from abc import ABCMeta, abstractmethod #ABCMeta–让类变成纯虚类
class Super(metaclass=ABCMeta):
def delegate(self):
self.action()
@abstractmethod
def action(self):
pass
#x = Super()
class Sub(Super):
def action(self):
print(‘spam’)
x = Sub()
x.delegate()