我有一个定义多个类属性和多个方法的类。这些方法的默认参数等于类属性。有时,属性是从方法(使用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。
(*)实际上,该类中有数十种方法,并且我不想过多更改现有代码,因为在项目的其他地方使用了类似的编码约定。如果您想争论,请从教育角度考虑这个问题。
答案 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中并不是很常见的事情,所以我猜想大多数解决方案都会有些丑陋(但是我很想看到一个反例!)