类方法如何影响Python中的实例变量?
我已经通读了很多关于类方法和实例方法之间区别的帖子。我从概念上理解它们,但现在我试图找出更微妙的细微差别。在下面的示例中,如果我调用类方法如何影响Python中的实例变量?,python,class,Python,Class,我已经通读了很多关于类方法和实例方法之间区别的帖子。我从概念上理解它们,但现在我试图找出更微妙的细微差别。在下面的示例中,如果我调用User.createUser('xyz'),那么userId存储在哪里?是否转到下面的(*),即实例上?或者就像我插入了userId=None,在那里我有注释#占位符和userId从User.createUser('xyz')传入,然后用'xyz'分配类变量userId class User(): # placeholder def __in
User.createUser('xyz')
,那么userId
存储在哪里?是否转到下面的(*),即实例上?或者就像我插入了userId=None
,在那里我有注释#占位符
和userId
从User.createUser('xyz')
传入,然后用'xyz'
分配类变量userId
class User():
# placeholder
def __init__(self, userId):
self.userId = userId # (*)
@classmethod
def createUser(cls, userId):
if not isValid(userId): # isValid may or may not be part of the class
return False
else:
return cls(userId)
# ... other methods
userId
参数存储在方法中
对cls(userId)
的调用相当于对User(userId)
的调用,在您的情况下,两者都不相同。return cls(userId)
返回一个新对象*,userId
被分配给新对象的self
。因此,它既不是类也不是实例变量,而是另一个对象的实例变量。您的classmethod createUser返回用户对象的新实例。传递给它的参数作为一个属性存储在此新用户实例上。cls(userId)
实例化您的类,并且userId
被传递给\uuu init\uuu
。因此,对于User
,将userId
存储在新实例中。cls(userId)
的工作原理与User(userId)
的工作原理完全相同,在python 3中,类被定义为不带括号的类用户:
,除非你想让这个类从另一个类中固有,那么你就使用括号类用户(User2):
那么为什么不返回用户(userId)?在你的例子中,返回的cls(userId)
和User(userId)
是相同的。这种差异只在用户的子类中变得明显。这种差异会是什么?区别在于cls
指的是当前类,其中User
指的是特定的用户类。如果您有一个子类SpecialUser(User)
,在createUser
方法中使用cls
意味着SpecialUser。createUser
将返回SpecialUser而不是用户