Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python property.setter和继承_Python_Properties_Getter Setter - Fatal编程技术网

Python property.setter和继承

Python property.setter和继承,python,properties,getter-setter,Python,Properties,Getter Setter,我有两个类,基类和子类(其中子类是基类的子类)。在每一个类中,我都有一个属性“foo”,我希望能够获取并设置它。“foo”的设置方式与类无关——基类和子类的设置方式相同。但是,“获取”属性“foo”的方式取决于类。因此,我想要一种在基类上定义我的“setter”的方法,并让它继承到子类,从而使它与子类和基类中的“getter”的依赖于类的实现兼容 我的第一反应是使用python@property和@property.setter。我很快就遇到了问题: 类基类(对象): 定义初始化(自): sel

我有两个类,基类和子类(其中子类是基类的子类)。在每一个类中,我都有一个属性“foo”,我希望能够获取并设置它。“foo”的设置方式与类无关——基类和子类的设置方式相同。但是,“获取”属性“foo”的方式取决于类。因此,我想要一种在基类上定义我的“setter”的方法,并让它继承到子类,从而使它与子类和基类中的“getter”的依赖于类的实现兼容

我的第一反应是使用python@property和@property.setter。我很快就遇到了问题:

类基类(对象):
定义初始化(自):
self.\u foo=无
@财产
def foo(self):
打印“基类”
@foo.setter
def foo(自身,val):
self._foo=val
类子类(基类):
@财产
def foo(self):
打印“子类”
我天真的希望foo.setter将被继承到子类中,并与foo属性的子类实现兼容。然而:

b=BaseClass()
s=子类()
b、 福
基类
s、 福
子类
b、 foo='BaseClass!'
s、 foo='Subclass!'
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:无法设置属性
我相信这里发生的事情是,'@foo.setter'在编译时被绑定到基类名称空间,因此子类不可用(尽管在这一点上我可能是错的)


有人能告诉我一个简单的方法来实现我在这里想要的吗?它不一定需要使用python属性内置,但这很好。

这里有一些有趣的事情
BaseClass.foo
是一个对象,并且

@foo.setter       
def foo(self, val):
    self._foo = val
返回该对象的修改副本

在子类中,您通过重新创建属性来重新定义这个对象,因此您需要编写一个新的setter或遵循AranFey的答案


我找到了一个可能也有助于理解此想法的方法。

您可以使用
@BaseClass.foo.getter
使用其他getter创建属性的副本:

class Subclass(BaseClass):
    @BaseClass.foo.getter
    def foo(self):
        print('Subclass')

有关详细信息,请参阅。

这是python2.7吗?@DeveshKumarSingh是的,关于这一点: