Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中用实例函数重写类函数_Python_Oop_Instance_Class Method - Fatal编程技术网

在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继承classmethod
foo()
的子类
slaveInstance
是一个孙子类(不是实例),然后作为实例方法重写
foo()
。(顺便说一句,避免混淆的样式点是:类名应该是CamelCase,并且永远不要包含“class”(这不是Java)或
实例
类型
(在类名中完全错误)所以:
slaveClass
应该只是
Slave
,而'master`be
master
slaveType
不是一个类型,它只是一个例子……通过“我想知道,如果有其他方法的话。”我想你的意思是“我可以将classmethod子类化并重写为实例方法,但仍然可以从孙子类中将其作为classmethod调用吗?”我知道。我试图想出一种方法来绕过它,因为如果cls实际上是一个实例而不是一种类型,那么cls.bar()也可以工作。