在 python 中,当 class 的实例调用 @class 方法时会发生什么

in python what happens when an instance of a class calls a @classmethod

所以我有一个 class 模型和内部模型 我有一个方法保存

def save(self):
    args = list(map(self.getValueOrDefault,self.__fields__))
    args.append(self.getValueOrDefault(self.__primary_key__))
    logging.debug('saving %s' % str(args))
    row = yield from execute(self.__insert__,args)
    if row != 1:
        logging.debug('failed to insert record: affected rows: %s' % row)
    else:
        logging.info('insertion was succesful')

这里是getValueOrDefault的代码,它们在同一个class

def getValueOrDefault(self,key):
    value = getattr(self,key)
    if value is None:
        field = self.__mapping__[key]
        if field.default is not None:
            value = field.default() if callable(field.default) else field.default
            logging.info('using default value for %s ==> %s' % (key,value))
            setattr(self,key,value)
    return value

如果我添加 class 方法来保存并从实例调用保存,我会收到一条错误消息,指出 getValueOrDefault 需要额外的位置参数 'key'。我的猜测是,当我从一个实例调用它时,self(它变成了一个 cls)是 class 本身而不是创建的实例,我正在尝试做 Model.getValueOrDefault 但它不应该给我一些错误告诉我如果不初始化 class?

就无法调用函数

My guess is when I call it from a instance the self (which becomes a cls) is the class itself not the instance created

是的。

and I'm trying to do Model.getValueOrDefault but shouldn't it give me some error that tells me I can't call a function without initializing the class?

没有。调用 Model.getValueOrDefault 是完全有效的,但是当你这样做时你必须明确地传递 self