python装饰器之property

python装饰器之@property

@property是python内置的装饰器,主要作用是把类中的一个方法变为类中的一个属性,并且使定义属性和修改现有属性变得更容易

class UserInfo(object):
    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self,name):
        if isinstance(name,str):
            self.__name = name
        else:
            raise TypeError("The name must be str")

if __name__ == "__main__":
    user = UserInfo()
    user.name = "linux超"
    print("我的名字是",user.name)
    user.name = ["linuc"]
    print("我的名字是",user.name)

输出结果:

我的名字是 linux超
Traceback (most recent call last):
  File "E:/Demotest/test4.py", line 17, in <module>
    user.name = ["linuc"]
  File "E:/Demotest/test4.py", line 11, in name
    raise TypeError("The name must be str")
TypeError: The name must be str

如果不使用@property,想要达到同样的效果

class UserInfo(object):
    def name(self):
        return self.__name

    def set_name(self,name):
        if isinstance(name,str):
            self.__name = name
            return self.__name
        else:
            raise TypeError("The name must be str")

if __name__ == "__main__":
    user = UserInfo()
    user.name = "linux超"
    print("我的名字是",user.set_name(user.name))
    user.name = ["linuc"]
    print("我的名字是",user.set_name(user.name))

输出结果

我的名字是 linux超
Traceback (most recent call last):
  File "E:/Demotest/test4.py", line 19, in <module>
    print("我的名字是",user.set_name(user.name))
  File "E:/Demotest/test4.py", line 12, in set_name
    raise TypeError("The name must be str")
TypeError: The name must be str

需要专门定义一个方法来定义属性,获取属性也比较麻烦。

使用装饰器@property会更直观

参考:

https://www.cnblogs.com/linuxchao/p/linuxchao-property.html

原文地址:https://www.cnblogs.com/ruguokeyi/p/11913259.html