SunmonDong 2016-03-29 09:57 采纳率: 0%
浏览 753

python @age.setter 装饰器 怎么用p.age=1调用不了

#源码:
class Person:
def init(self,name,age):
print('gouzao')
self.__name=name
self.__age=age
@property
def age(self):
print('thisis get')
return self.__age
@age.setter
def age(self,value):
print('jinlaileme')

if 0<age<150:

print('if ')

    self.__age=value
def display(self):
    print('person({s} {age})'.format(s=self.__name,age=self.__age))
def __str__(self):
    return 'person({s} {age})'.format(s=self.__name,age=self.__age)
def __repr__(self):
    return str(self)

p=Person('gsdg',32)
print(p.age)
p.age=21
print(p.age)
print(p)
#打印信息:
gouzao
thisis get
32
21
person(gsdg 32)

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-05 04:00
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在Python中,@age.setter装饰器是用来设置对象的属性值的方法。它接收一个参数,这个参数是一个函数,这个函数会在对象被设置为某个值时执行。

    在你的例子中,当你尝试使用 p.age = 21 来设置 Person 对象的年龄时,你需要提供一个函数作为装饰器的参数,该函数接受当前对象和一个新的值,并返回新的对象实例。然而,在你的代码中,你只提供了 age 属性的getter方法(@property)和setter方法(@age.setter),而没有提供实际的装饰器函数。

    因此,当尝试调用 p.age = 21 时,Python 解释器会首先获取 p.age 的值,然后执行 age = 21 的语句,但是由于没有对应的装饰器函数,所以不会改变对象的 age 值。

    如果你希望在设置年龄时自动更新对象的 age 值,你应该提供一个装饰器函数,如下所示:

    class Person:
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def set_age(self, value):
            self.age = value
            return self
    
        @staticmethod
        def from_string(name, age_str):
            name, age = age_str.split()
            return Person(name, int(age))
    
        @classmethod
        def from_dict(cls, data):
            name, age = data['name'], data['age']
            return cls(name, int(age))
    
        def to_dict(self):
            return {'name': self.name, 'age': self.age}
    
        def __str__(self):
            return f"Person({self.name}, {self.age})"
    
        def __repr__(self):
            return str(self)
    
    
    if __name__ == '__main__':
        p = Person.from_string("gsdg", "32")
        print(p)  # 输出:Person(gsdg, 32)
        print(p.age)  # 输出:32
        p.set_age(21)
        print(p.age)  # 输出:21
        print(p)  # 输出:Person(gsdg, 21)
    

    在这个版本的代码中,我们定义了一个名为 set_age 的静态方法来设置年龄,同时定义了两个类方法 from_stringfrom_dict 来创建对象。此外,我们还重写了 __str____repr__ 方法以支持字符串表示。这样,当我们尝试设置 age 属性时,如果传入的值是数字,那么我们可以直接设置 age 值并立即返回对象实例;否则,我们将传递给 set_age 方法。

    评论

报告相同问题?