【发布时间】:2020-10-25 20:14:15
【问题描述】:
下面,我展示了一个更复杂代码的简化示例,但它完全代表了我遇到的问题。
第 1 部分:工作正常,没有问题:
class Animal():
def __init__(self, animal_name = "no name given"):
self.set_name(animal_name)
def get_name(self):
return self._animal_name
def set_name(self, animal_name):
self._animal_name = animal_name
class Dog(Animal):
def __init__(self, dog_breed = "no breed", dog_name = "no name given"):
self._dog_breed = dog_breed
super().__init__(dog_name)
def get_breed(self):
print(self._dog_breed)
x = Dog('Greyhound', 'Rich')
第 2 部分:引入 getter 和 setter 装饰器后,代码停止工作:
class Animal():
def __init__(self, animal_name = "no name given"):
#THE LINE BELOW SEEMS TO CAUSE AN ISSUE
self.name(animal_name)
@property
def name(self):
return self._animal_name
@name.setter
def name(self, animal_name):
self._animal_name = animal_name
class Dog(Animal):
def __init__(self, dog_breed = "no breed", dog_name = "no name given"):
self._dog_breed = dog_breed
super().__init__(dog_name)
def get_breed(self):
print(self._dog_breed)
x = Dog('Greyhound', 'Rich')
输出:AttributeError:“狗”对象没有属性“_animal_name”
当我保留第 2 部分中的装饰器但将 Animal 类中的构造函数更改为:
class Animal():
def __init__(self, animal_name = "no name given"):
self._animal_name=animal_name
有效。
我只是好奇为什么它在上面 第 2 部分的示例中不起作用?
【问题讨论】:
-
如果你使用
self.name=animal_name而不是self.name(animal_name),它是否有效? -
是的,这解决了问题。因此,当我使用装饰器时,我需要将类中的 getter 和 setter 方法视为一个属性,即使在类构造函数中也是如此:我现在明白了。谢谢!
标签: python-3.x python-decorators