[python]在类中使用@property

关于在类中使用@property网上教程都介绍了许多,我从另一个方向解释一下在类中使用@property。

下面是一个例子,创建一个Person类,在age方法的定义前加上@property,在name方法的定义前没有加上@property:

class Person(object):
    def __init__(self, age = 1, name = 'yy'):
        self._age = age
        self._name = name
        
    @property
    def age(self):
        return self._age
    
    @age.setter
    def age(self,age):
        if isinstance(age, int):
            self._age = age
        else:
            raise ValueError('age must be integer!')
#    @property
    def name(self):
        return self._name
       
if __name__ == '__main__':
    person = Person()

    person.age = 10
    print(person.age)
    
    print("type of age:{}".format(type(person.age)))
    print("type of name:{}".format(type(person.name)))

此时,返回的结果为

1
10
type of age:<class 'int'>
type of name:<class 'method'>

分析结果:

  1. age默认值是1,实例化Person类的时候更改age的值,返回默认值1。第一行结果符合预期。但是需要注意的是,大家是否对print(person.age)这一行有些疑问,age后面为什么没有括号,即print(person.age())?如果这样来写,会报错:TypeError: 'int' object is not callable。age现在是int类型,而不是method类型,所以不可以被调用。这个疑问会再进一步进行分析
  2. 调用person.age=10后,将age的值改为10,返回10。第二行结果符合预期
  3. 三四行的结果显示,age是int类型,name是method类型

如果此时将name前的@property加上,即

class Person(object):
    [省略...]
    @property
    def name(self):
        return self._name

返回的结果是:

1
10
type of age:<class 'int'>
type of name:<class 'str'>

可以看到,一旦在method前面加上@property后,会将method类型更改成return结果的类型:

  • 对于age来说,由于_age是int类型,所以age从method类型变成了int类型
  • 对于name来说,由于_name是str类型,所以name从method类型变成了str类型

总结

类中的方法前加上@property后,会将该方法从方法类型改为return结果的类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值