11 python inheritance new-style-class
我可以强制父类调用派生类的函数版本吗?
class Base(object):
attr1 = ''
attr2 = ''
def virtual(self):
pass # doesn't do anything in the parent class
def func(self):
print "%s, %s" % (self.attr1, self.attr2)
self.virtual()
Run Code Online (Sandbox Code Playgroud)
以及从中衍生出来的一类
class Derived(Base):
attr1 = 'I am in class Derived'
attr2 = 'blah blah'
def virtual(self):
# do stuff...
# do stuff...
Run Code Online (Sandbox Code Playgroud)
清除模糊:
d = Derived()
d.func() # calls self.virtual() which is Base::virtual(),
# and I need it to be Derived::virtual()
Run Code Online (Sandbox Code Playgroud)
如果你实例化一个Derived(比如说d = Derived()),.virtual那个被调用的d.func() 是 Derived.virtual.如果没有Derived涉及的实例,则没有适合self的Derived.virtual,所以当然不可能称之为.
这并非不可能-实际上有一种解决方法,您不必传递函数或类似的东西。我自己正在一个项目中解决这个确切的问题。解决方法如下:
class Base(): # no need to explicitly derive object for it to work
attr1 = 'I am in class Base'
attr2 = 'halb halb'
def virtual(self):
print "Base's Method"
def func(self):
print "%s, %s" % (self.attr1, self.attr2)
self.virtual()
class Derived(Base):
attr1 = 'I am in class Derived'
attr2 = 'blah blah'
def __init__(self):
# only way I've found so far is to edit the dict like this
Base.__dict__['_Base_virtual'] = self.virtual
def virtual(self):
print "Derived's Method"
if __name__ == '__main__':
d = Derived()
d.func()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10949 次 |
| 最近记录: |