python中父类要约束子类有两种方式:
- abc模块中的抽象类
- raise直接报异常
为什么要约束呢,比如我们要对不同的用户实现登陆功能,那么如果分给不同的人来写,限于各人的水平不同,可能最后写出来的结果是不一样的,那么有没有可能约束他们,使得他们写出来的一定是一样的呢? 就是上面所谓的约束
我们看第一种实现:
from abc import ABCMeta, abstractmethod
class Base(metaclass=ABCMeta):
@abstractmethod
def login(self):
pass
class Normal(Base):
def login(self):
pass
class Vip(Base):
def denglu(self):
pass
def login(obj):
print("登陆")
obj.login()
n = Normal()
v = Vip()
login(n)
login(v)
当执行到vip时,因为Vip类没有实现login方法而是denglu,就会出现报错:
Traceback (most recent call last):
File "code.py", line 29, in <module>
v = Vip()
TypeError: Can't instantiate abstract class Vip with abstract methods login
在python中: 抽象类不能实现抽象方法,子类必须实现抽象类的抽象方法,抽象类既可以约束子类又可以给子类提供方法.
我们看另一种简单实现:
class Base:
def login(self):
raise NotImplementedError('没有实现login方法')
class Normal(Base):
def login(self):
pass
class Vip(Base):
def denglu(self):
pass
def login(obj):
print("登陆")
obj.login()
n = Normal()
v = Vip()
login(n)
login(v)
同样在运行到VIp的login时会报错:
Traceback (most recent call last):
File "code.py", line 53, in <module>
login(v)
File "code.py", line 45, in login
obj.login()
File "code.py", line 32, in login
raise NotImplementedError('没有实现login方法')
NotImplementedError: 没有实现login方法
这种方式实现起来简单,但它仅限于抛出异常,通常情况下用这种方式即可,能做到很好的约束,并提示相应的错误信息.