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

Why Use Class Methods Instead Of Just Using The Class Name For Instance?

我有一个问题。我正在观看 class 教程并了解 class 方法。看到代码后可以更好地理解我的问题。我会先展示代码。

代码:

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 方法的部分。 这是:

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)

它们的工作原理相同。所以我的问题是为什么还要使用 class 方法?

python 中的类方法在您考虑继承时更有意义。让我们用一个更能引起共鸣的例子:

假设您有一个 class Item 代表您杂货店中的一件商品。我们还假设所有 Item 都可以两件装。我们将用 class 方法表示 returns 一个元组。

class Item:
    @classmethod
    def two_pack(cls):
        return cls(), cls()

现在假设您想要子class Item 来真正代表特定的项目,例如 Soda

class Soda(Item):
    pass

现在我们可以调用 Soda.two_pack() 并获得 Soda 个对象的元组,即使 two_pack 方法根本不知道 Soda 个对象。

这也涉及到 class 方法的主要用途,它提供了构建对象的替代方法,因此您不局限于 __init__

中的第一个方法

在您的示例中,您可能不会想要使用class方法。那是因为 fullname 只能有一个值,并且它附加到 Person class 对象。因此,如果 Person 中有多个 实例 ,则它们不能有单独的 fullname 值。

在您的情况下,您希望删除 class 方法并使用 from_fullname 引用 self,以便每个 Person 实例的名称都不同:

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

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

  • What are Class methods in Python for?
  • Difference between Class and Instance methods