Python:如何从同一类的类方法调用实例方法
我的课程如下:Python:如何从同一类的类方法调用实例方法,python,oop,python-2.7,class-method,Python,Oop,Python 2.7,Class Method,我的课程如下: class MyClass(object): int = None def __init__(self, *args, **kwargs): for k, v in kwargs.iteritems(): setattr(self, k, v) def get_params(self): return {'int': random.randint(0, 10)} @classmethod
class MyClass(object):
int = None
def __init__(self, *args, **kwargs):
for k, v in kwargs.iteritems():
setattr(self, k, v)
def get_params(self):
return {'int': random.randint(0, 10)}
@classmethod
def new(cls):
params = cls.get_params()
return cls(**params)
我希望能够做到:
>>> obj = MyClass.new()
>>> obj.int # must be defined
9
我的意思是不创建MyClass
的新实例,但显然不是那么简单,因为调用MyClass.new()
会抛出TypeError:unbound方法get_params()必须以MyClass实例作为第一个参数调用(取而代之的是什么都没有)
有没有办法做到这一点?
谢谢不,您不能也不应该从没有实例的类调用实例方法。这将是非常糟糕的。但是,您可以从和实例方法调用类方法。选择是
get_param
成为类方法并修复对它的引用\uuuu init\uuuu
调用get\u param
,因为它是一个实例方法另外,您可能会对实例方法感兴趣,因为这看起来像您正在尝试做的事情。当将实例方法视为实例方法并将类添加为实例时,您可以使用classmethod调用实例方法。在我看来,这的确是一个糟糕的做法,但它解决了你的问题
@classmethod
def new(cls):
params = cls.get_params(cls)
return cls(**params)
为什么不把
get_params
也作为一个classmethod呢?MyClass
就是一个例子,get_params
代表了一个从我的类中的其他实例方法被广泛调用的方法,我认为应该有某种方法从一个classmethod调用它,而不是改变当前调用它的所有方法。无论如何,谢谢:)get_params的功能是什么?如果它是一个实例方法,您应该需要一个实例来调用它。如果没有,它可能不应该是一个实例方法。不过,您可以从任何其他作用域调用实例方法,只需提供类的实例作为显式的第一个参数即可。@Gerard注意,您可以从实例调用类和静态方法,因此使get_params
aclassmethod
不应破坏任何执行instance.get_params()
的代码。它将破坏只执行类的操作的代码。获取参数(实例)
。没有实例就不能调用instancemethod。如果get_params
不需要访问该实例,那么只需将其设置为classmethod。这可能需要在其他地方做出一些改变,但没有办法。没有实例就不能调用instancemethod。请注意,您可以从实例方法调用classmethod而不会遇到任何问题,因此您实际上可能不必做您认为的那么多更改。注意:给定的选择没有解决我的问题,但可能对其他人有用。接受,因为解释很清楚为什么你不能这么做:)