开发者社区> 问答> 正文

避免重复的属性方法

你在类中需要重复的定义一些执行相同逻辑的属性方法,比如进行类型检查,怎样去简化这些重复代码呢?

展开
收起
哦哦喔 2020-04-17 16:26:29 932 0
2 条回答
写回答
取消 提交回答
  • 有点尴尬唉 你要寻找的东西已经被吃掉啦!
        def __init__(self, name ,age):
            self.name = name
            self.age = age
    
        @property
        def name(self):
            return self._name
    
        @name.setter
        def name(self, value):
            if not isinstance(value, str):
                raise TypeError('name must be a string')
            self._name = value
    
        @property
        def age(self):
            return self._age
    
        @age.setter
        def age(self, value):
            if not isinstance(value, int):
                raise TypeError('age must be an int')
            self._age = value
    
    2020-04-17 17:36:01
    赞同 展开评论 打赏
  • 考虑下一个简单的类,它的属性由属性方法包装:
    
    class Person:
        def __init__(self, name ,age):
            self.name = name
            self.age = age
    
        @property
        def name(self):
            return self._name
    
        @name.setter
        def name(self, value):
            if not isinstance(value, str):
                raise TypeError('name must be a string')
            self._name = value
    
        @property
        def age(self):
            return self._age
    
        @age.setter
        def age(self, value):
            if not isinstance(value, int):
                raise TypeError('age must be an int')
            self._age = value
    可以看到,为了实现属性值的类型检查我们写了很多的重复代码。 只要你以后看到类似这样的代码,你都应该想办法去简化它。 一个可行的方法是创建一个函数用来定义属性并返回它。例如:
    
    def typed_property(name, expected_type):
        storage_name = '_' + name
    
        @property
        def prop(self):
            return getattr(self, storage_name)
    
        @prop.setter
        def prop(self, value):
            if not isinstance(value, expected_type):
                raise TypeError('{} must be a {}'.format(name, expected_type))
            setattr(self, storage_name, value)
    
        return prop
    
    # Example use
    class Person:
        name = typed_property('name', str)
        age = typed_property('age', int)
    
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
    2020-04-17 16:26:40
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
建立联系方法之一 立即下载
继承与功能组合 立即下载
用计算和数据去改变整个世界 立即下载