pyeden - Overview

from abc import ABC, abstractmethod

class Validator(ABC):
    """
    使用python描述器来验证名字是不是“future.deng”
    """

    def __set_name__(self, owner, name):
        self.private_name = '_' + name

    def __get__(self, obj, objtype=None):
        return getattr(obj, self.private_name)

    def __set__(self, obj, value):
        self.validate(value)
        setattr(obj, self.private_name, value)

    @abstractmethod
    def validate(self, value):
        pass


class ValidatorName(Validator):
    """
    使用类继承的方式实现validate方法
    """
    def __init__(self, is_validator_name=True):
        self.is_validator_name = is_validator_name

    def validate(self, value):
        if self.is_validator_name:
            if value != 'Future Deng':
                raise ValueError("Future Deng 的私人代码,必须传入'Future Deng' 才能被实例化")


class PythonWebEngineer:

    name = ValidatorName(is_validator_name=True)

    def __init__(self, name):
        self.name = name
        self.age = 28
        self.role = "Python Engineer"
        self.language_spoken = ["zh_CN", "en_US"]
        self.skill = ["Python", "React", "Golang"]


if __name__ == '__main__':
    me = PythonWebEngineer('Future Deng')
    me.name
    
# 输出结果
# Future Deng

#   me = PythonWebEngineer('Future Dengsss')
#   me.name

# 若是传入错误的值 'Future Dengsss'
"""
  File "/Users/futuredeng/opt/backendxh/dsz.py", line 161, in validate
    raise ValueError("Future Deng 的私人代码,必须传入'Future Deng' 才能被实例化")
ValueError: Future Deng 的私人代码,必须传入'Future Deng' 才能被实例化
"""