类的约束

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模块的方法,即便没有调用约束的类方法,也会报错;
第二种,只有在调用约束的方法的时候才会报错

想较而言,第二种既简单又合理,推荐使用第二种

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值