1. 定义
约束其字类必须要定义某个方法,用于维护代码统一规范
2. 普通继承
class Person():
def talk(self):
print('talk')
class China(Person):
pass
p = China()
p.talk() # talk
China类继承Person类,同时继承了talk方法,实例化后的p对象可执行talk方法
3. 类的约束
如果我必须要Person的字类中定义talk方法呢?
3.1 强约束(使用abc模块)
使用abc模块
3.1.1 当Person子类China类中未定义talk方法时
代码示例
当Person字类China类中未定义talk方法时
import abc
class Person(metaclass=abc.ABCMeta):
@abc.abstractclassmethod
def talk(self):
print('talk')
class China(Person):
pass
p = China()
# p.talk()
执行代码
报错了
即使实例化后的对象没有调用talk方法也会报错
Traceback (most recent call last):
File "C:/SoftWare/Program Files/JetBrains/PycharmProjects/类的约束.py", line 22, in <module>
p = China()
TypeError: Can't instantiate abstract class China with abstract methods talk
3.1.2 当Person子类China类中定义talk方法后
1)china定义talk,但无具体动作
代码示例
import abc
class Person(metaclass=abc.ABCMeta):
@abc.abstractclassmethod
def talk(self):
print('talk')
class China(Person):
def talk(self):
pass
p = China()
p.talk()
执行结果
由于China类中定义的talk方法直接pass,所以,程序执行不会报错(因为定义了talk方法),同时也没有内容数据
2)china定义talk,且有动作
代码示例
import abc
class Person(metaclass=abc.ABCMeta):
@abc.abstractclassmethod
def talk(self):
print('talk')
class China(Person):
def talk(self):
print('talk chinese')
p = China()
p.talk()
执行结果
talk chinese
3.2 弱约束(抛出NotImplementedError异常)
使用raise NotImplementedError()
方法抛出异常
3.2.1 仅实例化对象,不调用talk方法
代码示例
class Person():
def talk(self):
raise NotImplementedError('talk func must be Implemented')
class China(Person):
pass
p = China()
执行结果
直接执行脚本,并未报错
3.2.2 实例化对象,并调用talk方法
代码示例
class Person():
def talk(self):
raise NotImplementedError('talk func must be Implemented')
class China(Person):
pass
p = China()
p.talk()
执行结果
Traceback (most recent call last):
File "/Users/malingang/Knowledge/Python/Pycharm_Project/Py27/classes/day19/CMDB/CMDB/Client/类的约束.py", line 33, in <module>
p.talk()
File "/Users/malingang/Knowledge/Python/Pycharm_Project/Py27/classes/day19/CMDB/CMDB/Client/类的约束.py", line 27, in talk
raise NotImplementedError('talk func must be Implemented')
NotImplementedError: talk func must be Implemented
3.3 两种约束的对比
第一种导入abc模块的方法,即便没有调用约束的类方法,也会报错;
第二种,只有在调用约束的方法的时候才会报错
想较而言,第二种既简单又合理,推荐使用第二种