如何使父级的类属性进入派生类的范围?

时间:2018-07-11 02:21:39

标签: python

我有一个定义多个类属性和多个方法的类。这些方法的默认参数等于类属性。有时,属性是从方法(使用self.开头)中使用的。

class MyClass:
    VAL1 = "hello"
    VAL2 = "world"

    def foo(self, x=VAL1, y=VAL2):
        if x == self.VAL1:
            print "yay"

    def bar(self, t=VAL2):
        pass

现在,由于某种原因,我想将属性声明移到一个单独的类中,并在其子级之间拆分方法。

class Base:
    VAL1 = "hello"
    VAL2 = "world"

class Derived1(Base):
    def foo(self, x=VAL1, y=VAL2):
        if x == self.VAL1:
            print "yay"

class Derived2(Base):
    def bar(self, t=VAL2):
        pass

但是,这无效,因为Base的参数VAL1和VAL2在派生类中超出范围。

现在要点:我无法更改方法的代码 *。因此,写def bar(self, t=Base.VAL2)的明显方法行不通。

还有其他扩展范围的方法吗?

我正在使用Python 2.7。

(*)实际上,该类中有数十种方法,并且我不想过多更改现有代码,因为在项目的其他地方使用了类似的编码约定。如果您想争论,请从教育角度考虑这个问题。

1 个答案:

答案 0 :(得分:-1)

怎么样:

class Base:
    VAL1 = "hello"

class Derived1(Base):
    VAL1 = Base.VAL1

    def foo(self, x=VAL1):
        print(x)

d = Derived1()
d.foo()

编辑:我不确定它看起来是否漂亮,但它自动化程度更高,也许更适合您。

import inspect

class Base:
    VAL1 = "hello"
    VAL2 = "world"

class Derived1(Base):
    for var, val in inspect.getmembers(Base):
        locals()[var] = val

    def foo(self, x=VAL1, y=VAL2):
        if x == self.VAL1:
            print "yay"
        if y == self.VAL2:
            print "hoorah!"

d1 = Derived1()
d1.foo()

双重编辑:

如果您不想复制__doc____module__,则可以使用

for var, val in inspect.getmembers(Base):
    if(var[:2] != '__'):
        locals()[var] = val

据我所知,这在Python中并不是很常见的事情,所以我猜想大多数解决方案都会有些丑陋(但是我很想看到一个反例!)