gpt4 book ai didi

Python:继承类函数(属性 getter )不起作用

转载 作者:行者123 更新时间:2023-12-01 05:50:07 24 4
gpt4 key购买 nike

考虑以下代码:

class BaseClass(object):
def _del_property(attr):
"""Abstract deller"""
def del_attr(self):
setattr(self, attr, None)
return del_attr

def _set_property(attr):
"""Abstract setter."""
def set_attr(self, x):
setattr(self, attr, x)
return set_attr

def _get_property(attr):
"""Abstract getter"""
def get_attr(self):
getattr(self, attr)
return get_attr

_name = None
name = property(fget=_get_property('_name'), fset=_set_property('_name'))


class Component(BaseClass):

_material = None
material = property(fget=_get_property('_material'), fset=_set_property('_material'), fdel=_del_property('_material'))

为什么_get_property、_set_property和_del_property不被继承?如何实现?

它应该适用于同一源文件中的派生类,以及单独文件中的派生类,这些派生类使用

导入此源文件
from filename import *

最佳答案

创建类时,会创建一个新的命名空间。 Python 读取类 block 内的代码块,然后将信息传递给 type (或相应的元类)。在这种情况下,python 会提示,因为在设置 Component 时类,_get_property未在该范围内定义 - 也许 BaseClass._get_property ,但这可能也不会像您希望的那样工作。

一个简单的解决方法是使这些函数成为模块级函数,因为类命名空间可以访问模块命名空间:

def _del_property(attr):
"""Abstract deller"""
def del_attr(self):
setattr(self, attr, None)
return del_attr

def _set_property(attr):
"""Abstract setter."""
def set_attr(self, x):
setattr(self, attr, x)
return set_attr

def _get_property(attr):
"""Abstract getter"""
def get_attr(self):
getattr(self, attr)
return get_attr


class BaseClass(object):

_name = None
name = property(fget=_get_property('_name'), fset=_set_property('_name'))


class Component(BaseClass):

_material = None
material = property(fget=_get_property('_material'), fset=_set_property('_material'), fdel=_del_property('_material'))

也许在我们创建类时查看该类更有启发性:

class BaseClass(object):

def _del_property(attr):
"""Abstract deller"""
def del_attr(self):
setattr(self, attr, None)
return del_attr

print type(_del_property)
print type(BaseClass._del_property)

这将打印:

<type 'function'>
<type 'instancemethod'>

所以,您正在处理 BaseClass 内的常规函数,但它变成了 instancemethod之后type是不是很神奇。

<小时/>

就我个人而言,我只会创建一个便利函数:

def property_api(name,fget=True,fset=True,fdel=True):
return property(fget=_get_property(name) if fget else None,
fset=_set_property(name) if fset else None,
fdel=_del_property(name) if fdel else None)

然后您就可以使用它了。如果你真的愿意,你甚至可以把它放在BaseClass上作为staticmethod :

 class BaseClass(object):
property_api = staticmethod(property_api)

那么你的派生类将如下所示:

 class DerivedClass(BaseClass):
_material = None
material = BaseClass.property_api('_material')

关于Python:继承类函数(属性 getter )不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14605134/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com