Python 为什么要使用类方法而不是仅使用类名称作为实例?

Python 为什么要使用类方法而不是仅使用类名称作为实例?,python,python-3.x,class,class-method,Python,Python 3.x,Class,Class Method,我有个问题。我正在观看课堂教程和跨课堂方法的cam。看了代码后,我的问题可以更好地理解。我将首先显示代码 守则: class Person: def __init__(self, firstname, lastname): self.firstname = firstname self.lastname = lastname self.from_lastname() def from_lastname(self):

我有个问题。我正在观看课堂教程和跨课堂方法的cam。看了代码后,我的问题可以更好地理解。我将首先显示代码

守则:

class Person:
    def __init__(self, firstname, lastname):
        self.firstname = firstname
        self.lastname = lastname
        self.from_lastname()


    def from_lastname(self):
        Person.mostpreviouslastname = self.lastname

p1 = Person('Mike', 'Wizoski')
print(Person.mostpreviouslastname)
print(p1.lastname)

p2 = Person ('Indiana', 'Jones')
print(p1.lastname)
print(p2.lastname)
print(Person.mostpreviouslastname)
这是没有类方法的部分。 这与:

class Person:
    def __init__(self, firstname, lastname):
        self.firstname = firstname
        self.lastname = lastname
        Person.from_lastname(self.lastname)


    @classmethod
    def from_lastname(cls, last_name1):
        cls.mostpreviouslastname = last_name1

p1 = Person('Mike', 'Wizoski')
print(Person.mostpreviouslastname)
print(p1.lastname)

p2 = Person ('Indiana', 'Jones')
print(p1.lastname)
print(p2.lastname)
print(Person.mostpreviouslastname)

他们两个工作一样。所以,我的问题是,为什么甚至使用类方法?在Python中,< P/> < P>类方法在考虑继承时更有意义。让我们使用一个稍微更具启发性的例子:

假设您有一个类
Item
,它表示杂货店中的一种商品。我们还可以说,所有
物品都可以装在两个包装中。我们将用一个返回元组的classmethod来表示它

class Item:
    @classmethod
    def two_pack(cls):
        return cls(), cls()
现在让我们假设您想要子类化
Item
来真正表示特定的项目,比如
Soda

class Soda(Item):
    pass
现在我们可以调用
Soda.two\u pack()
并获得
Soda
对象的元组,即使
two\u pack
方法根本不知道
Soda
对象


这也涉及了类方法的主要用途,它提供了构建对象的替代方法,因此,在考虑继承时,Python中的类方法在<代码> >让我们使用一个稍微更具启发性的例子:

假设您有一个类
Item
,它表示杂货店中的一种商品。我们还可以说,所有
物品都可以装在两个包装中。我们将用一个返回元组的classmethod来表示它

class Item:
    @classmethod
    def two_pack(cls):
        return cls(), cls()
现在让我们假设您想要子类化
Item
来真正表示特定的项目,比如
Soda

class Soda(Item):
    pass
现在我们可以调用
Soda.two\u pack()
并获得
Soda
对象的元组,即使
two\u pack
方法根本不知道
Soda
对象


这还涉及到类方法的主要用途,它提供了构建对象的替代方法,因此您不局限于
\uuuu init\uuuu

在您的示例中,您可能不想使用类方法。这是因为
fullname
只能有一个值,它附加到
Person
类对象。因此,如果您曾经有多个
Person
实例,那么它们就不能有单独的
fullname

在您的情况下,您希望删除class方法,并从\u fullname
reference
self
中删除
,以便每个
人的名字都不同
实例:

class Person:
    def __init__(self, firstname, lastname):
        self.firstname = firstname
        self.lastname = lastname
        self.from_fullname()

    def from_fullname(self):
        self.fullname = self.lastname


p1 = Person('Mike', 'Wizoski')
p2 = Person('Bob', 'Jones')
print(p1.fullname)
print(p2.fullname)
# Wizoski
# Jones
如果您坚持使用其中一个示例,则在实例化多个人时会得到错误的结果:

# Jones
# Jones
那么什么时候使用类方法呢?当您有一些不使用任何实例数据的函数时(即不需要
self
引用)。更详细的解释可以在这里找到:


在您的示例中,您可能不想使用类方法。这是因为
fullname
只能有一个值,它附加到
Person
类对象。因此,如果您曾经有多个
Person
实例,那么它们就不能有单独的
fullname

在您的情况下,您希望删除class方法,并从\u fullname
reference
self
中删除
,以便每个
人的名字都不同
实例:

class Person:
    def __init__(self, firstname, lastname):
        self.firstname = firstname
        self.lastname = lastname
        self.from_fullname()

    def from_fullname(self):
        self.fullname = self.lastname


p1 = Person('Mike', 'Wizoski')
p2 = Person('Bob', 'Jones')
print(p1.fullname)
print(p2.fullname)
# Wizoski
# Jones
如果您坚持使用其中一个示例,则在实例化多个人时会得到错误的结果:

# Jones
# Jones
那么什么时候使用类方法呢?当您有一些不使用任何实例数据的函数时(即不需要
self
引用)。更详细的解释可以在这里找到:


方法想对类的实例做一些事情,classmethod想对类本身做一些事情(例如使用它来创建实例)方法想对类的实例做一些事情,classmethod想对类本身做一些事情(例如使用它来创建实例)这不是我想要的。我把问题改了一点,使它更容易理解。不过这不是我想要的。我把问题改了一点,使它更容易理解。不过是Thx。