类方法如何影响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而不是用户