在python中,当一个类的实例调用@classmethod时会发生什么

时间:2016-05-11 22:12:45

标签: python class-method

所以我有一个类Model和内部模型我有一个方法save

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的代码,它们在同一个类

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

如果我添加classmethod来保存并从实例调用save我得到一个错误,说getValueOrDefault需要额外的位置参数'key'。我的猜测是,当我从一个实例调用它时,self(它变成了一个cls)是类本身而不是创建的实例,我正在尝试做Model.getValueOrDefault但是它不应该给我一些错误告诉我我可以在没有初始化类的情况下调用函数?

1 个答案:

答案 0 :(得分:1)

  

我的猜测是当我从一个实例调用它时,self(它变成一个cls)就是类本身而不是创建的实例

烨。

  

我正在尝试做Model.getValueOrDefault,但它不应该给我一些错误,告诉我在没有初始化类的情况下我不能调用函数吗?

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