我有以下类ClassA
,为此动态创建一个方法,返回另一个方法的string
版本:
# module_a.py
class ClassA(object):
def width(self):
return 5
def height(self):
return 10
@classmethod
def add_str_method(cls, name):
method = getattr(cls, name)
def str_method(self):
return str(method(self))
setattr(cls, '{0}_str'.format(name), str_method)
for name in ['width', 'height']:
ClassA.add_str_method(name)
只要我不在另一个模块中继承ClassA
,这部分就可以完美地运行。但是当我这样做时,就像下面的例子中一样,动态添加的方法不会被继承。
# module_b.py
from module_a import ClassA
class ClassB(ClassA):
pass
动态添加方法的正确方法是什么,以便子类自动继承它们?
答案 0 :(得分:2)
首先,如果要动态更新类add_str_method
(而不仅仅是@classmethod
的实例),则必须将A
声明为A
。
# file a.py
class A(object):
def __init__(self, a=5):
self._a = a
def a(self):
return self._a
@classmethod
def add_str_method(cls, name):
def str_method(self):
return str(getattr(self, name)())
setattr(cls, '{0}_str'.format(name), str_method)
for name in ['a']:
A.add_str_method(name)
要从a
访问A
方法,以及附加到特定实例的变量_a
,str
方法必须限制为{{ 1}},请注意以下几行:
self
现在,使用此测试脚本,它可以按预期工作:
def str_method(self):
return str(getattr(self, name)())
答案 1 :(得分:0)
您必须将此过程添加到__init__
的初始化(classA
)中:
class ClassA(object):
def __init__(self):
for name in ['width', 'height']:
self.add_str_method(name)
def width(self):
return 5
def height(self):
return 10
def add_str_method(cls, name):
method = getattr(self, name)
def str_method(self):
return str(method())
setattr(cls, '{0}_str'.format(name), str_method)
现在正在做
from module_a import ClassA
class ClassB(ClassA):
pass
print(dir(ClassB))
给出:
>>> ... 'height', 'width']