Python中两种约束

python中父类要约束子类有两种方式:

  1. abc模块中的抽象类
  2. 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方法

这种方式实现起来简单,但它仅限于抛出异常,通常情况下用这种方式即可,能做到很好的约束,并提示相应的错误信息.

上一篇:Python中的互斥锁

下一篇:响应式布局