在python中用实例函数重写类函数
考虑这个例子:在python中用实例函数重写类函数,python,oop,instance,class-method,Python,Oop,Instance,Class Method,考虑这个例子: class master: @classmethod def foo(cls): cls.bar() class slaveClass( master ): @classmethod def bar(cls): print("This is class method") slaveType = slaveClass slaveType.foo() class slaveInstance( master ):
class master:
@classmethod
def foo(cls):
cls.bar()
class slaveClass( master ):
@classmethod
def bar(cls):
print("This is class method")
slaveType = slaveClass
slaveType.foo()
class slaveInstance( master ):
#def foo(self):
# self.foo()
def __init__(self,data):
self.data=data
print("Instance has been made")
def bar(self):
print("This is "+self.data+" method")
slaveType = slaveInstance("instance")
slaveType.foo()
我知道当foo
的最后一个定义未注释时,它可以工作,但是有没有其他方法可以在不更改用法的情况下使用此foo
函数。我有一个大型项目,其中类定义了工作方式,我能够使用slaveType
改变工作方式,但碰巧有一种情况需要实例,并且有太多类似于foo
的函数需要为实例行为重写
谢谢你,斯塔克尔斯 请仔细查看文档以了解更多信息。实例方法将实例作为第一个参数传递,类方法将类作为第一个参数传递。调用
slaveType.foo()
传递一个实例slaveType
,作为foo()
的第一个参数foo()
需要一个类作为第一个参数。这怎么可能?原始的foo
是一个classmethod,因此根本不接收实例,只接收类。它不可能调用实例方法。我对示例进行了一点编辑,所以它更清楚我需要做什么。如果我取消注释最后一个foo
定义,我将永远不会调用classmethod,因为它被实例方法覆盖。我想知道,还有没有别的办法。我可以更改master类,但我需要保持使用slaveType的方式。我不得不建议咬紧牙关,彻底摆脱classmethods。任何其他的事情都会产生复杂的代码,你会后悔的。试着把这个问题解码成某种类似Python的东西slaveClass
是从Master继承classmethodfoo()
的子类slaveInstance
是一个孙子类(不是实例),然后作为实例方法重写foo()
。(顺便说一句,避免混淆的样式点是:类名应该是CamelCase,并且永远不要包含“class”(这不是Java)或实例
或类型
(在类名中完全错误)所以:slaveClass
应该只是Slave
,而'master`bemaster
slaveType
不是一个类型,它只是一个例子……通过“我想知道,如果有其他方法的话。”我想你的意思是“我可以将classmethod子类化并重写为实例方法,但仍然可以从孙子类中将其作为classmethod调用吗?”我知道。我试图想出一种方法来绕过它,因为如果cls实际上是一个实例而不是一种类型,那么cls.bar()也可以工作。