在 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
。
所以我有一个 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
。