class Parent(object):
def foo(self, number):
for _ in range(number):
print "Hello from parent"
class Child(Parent):
def foo(self, number, greeting):
for _ in range(number):
print greeting
class GrandChild(Child):
def foo(self):
super(GrandChild,self).foo(1, "hey")
p = Parent()
p.foo(3)
c = Child()
c.foo(2, "Hi")
g = GrandChild()
g.foo()
此代码演示了重写方法的签名可以轻松更改。在
正如对普通类的另一个答案所示,重写的继承方法的签名在子级中可能不同于在父级中的签名。在
即使父类是抽象基类,也是如此:
不恰当复杂的绕道
在Python元类中,尝试限制重写方法的能力是一个有趣的练习,这样方法的参数签名必须与基类的参数签名匹配。这是一个尝试。在
注意:我并不赞同这是一个好的工程想法,而且我也没有花时间去整理松散的部分,所以下面的代码可能没有什么可以提高效率的地方。在
^{pr2}$请注意,与Python中大多数“严格”或“私有”类型的思想一样,您仍然可以自由地将修补函数移植到一个“好类”上,并且这些monkey-patched函数不必满足签名约束。在
而且,即使您增加了元类的复杂性,该类会在类的
__dict__
中更新任何方法类型属性时进行检查,并在类被修改时继续发出assert
语句,您仍然可以使用type.__setattr__
绕过自定义行为并设置属性。在在这种情况下,我把杰夫·戈德布鲁姆想象成侏罗纪公园的伊恩·马尔科姆,茫然地看着你,说“同意的成年人,嗯,想办法……”
相关问题 更多 >
编程相关推荐