python中類的約束和限制對象添加屬性


通過__slots__限制對象可添加的屬性

class A:
    __slots__ = ['a', 'b']
    pass


a1 = A()
a1.a = 10
print(a1.a)
a1.c = 0    # 只能添加a,b屬性添加其他屬性就報錯

 

沒有約束

class Alipay:
    def pay(self, money):
        print('此次消費%s' % money)


class QQpay:
    def pay(self, money):
        print('此次消費%s' % money)


def pay(obj, money):
    obj.pay(money)

 

弱約束

class Pay:    # 弱約束
    def pay(self, money):
        pass


class Alipay(Pay):
    def pay(self, money):
        print('此次消費%s' % money)


class QQpay(Pay):
    def pay(self, money):
        print('此次消費%s' % money)


class Wechatpay(Pay):
    def fuqian(self, money):    # 不規范,不報錯
        print('此次消費%s' % money)


# class Wechatpay:
#     def pay(self, money):     #  規范統一
#         print('此次消費%s' % money)


def pay(obj, money):
    obj.pay(money)


a1 = Alipay()
q1 = QQpay()
c1 = Wechatpay()
# a1.pay(100)
# q1.pay(200)

pay(a1, 100)
pay(q1, 200)
pay(c1, 300)

 

強制約束

方法一、若不實現父類方法主動主動拋出異常進行約束

# 這個父類制定了一個約束,規范,子類一定要有pay方法。
class Pay:
    def pay(self, money):     # 主動拋異常
        raise Exception('未定義pay方法')


class Alipay(Pay):
    def pay(self, money):
        print('此次消費%s' % money)


class QQpay(Pay):
    def pay(self, money):
        print('此次消費%s' % money)


class Wechatpay:
    def pay(self, money):
        print('此次消費%s' % money)


class Unitypay(Pay):
    def fuqian(self, money):    # 沒實現父類方法
        print('此次消費%s' % money)


def pay(obj, money):  # 歸一化設計
    obj.pay(money)


a1 = Alipay()
q1 = QQpay()
c1 = Wechatpay()
d1 = Unitypay()
# a1.pay(100)
# q1.pay(200)

# pay(a1, 100)
# pay(q1, 200)
# pay(c1, 300)
pay(d1, 200)    # 沒實現父類方法在此處拋異常

 

方法二、利用模塊,如果子類不實現父類方法在實例化時就報錯

from abc import abstractmethod
from abc import ABCMeta


class Pay(metaclass=ABCMeta):   # 抽象類,在實例化就報錯
    @abstractmethod     # 定一個約束,規范,約束子類中一定要有pay方法
    def pay(self, money):
        pass


class Alipay(Pay):
    def pay(self, money):
        print('此次消費%s' % money)


class QQpay(Pay):
    def pay(self, money):
        print('此次消費%s' % money)


class Wechatpay:
    def pay(self, money):
        print('此次消費%s' % money)


class Unitypay(Pay):
    def fuqian(self, money):    # 沒實現父類方法
        print('此次消費%s' % money)


def pay(obj, money):
    obj.pay(money)


a1 = Alipay()
q1 = QQpay()
c1 = Wechatpay()
d1 = Unitypay()     # 沒實現父類方法,實例化時就報錯
# a1.pay(100)
# q1.pay(200)

# pay(a1, 100)
# pay(q1, 200)
# pay(c1, 300)
pay(d1, 200)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM