动态添加方法的继承

时间:2017-04-28 13:07:04

标签: python class

我有以下类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

动态添加方法的正确方法是什么,以便子类自动继承它们?

2 个答案:

答案 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方法,以及附加到特定实例的变量_astr方法必须限制为{{ 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']