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_Python 2.7_Class Method - Fatal编程技术网

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
    成为类方法并修复对它的引用
  • have
    \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
    a
    classmethod
    不应破坏任何执行
    instance.get_params()
    的代码。它将破坏只执行类的
    操作的代码。获取参数(实例)
    。没有实例就不能调用instancemethod。如果
    get_params
    不需要访问该实例,那么只需将其设置为classmethod。这可能需要在其他地方做出一些改变,但没有办法。没有实例就不能调用instancemethod。请注意,您可以从实例方法调用classmethod而不会遇到任何问题,因此您实际上可能不必做您认为的那么多更改。注意:给定的选择没有解决我的问题,但可能对其他人有用。接受,因为解释很清楚为什么你不能这么做:)