为什么使用类方法而不是仅使用实例的类名?

时间:2018-08-10 01:18:50

标签: python python-3.x class class-method

我有一个问题。我正在看课程教程和跨类方法的摄像头。看完代码,可以更好地理解我的问题。我将首先显示代码。

代码:

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)

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

2 个答案:

答案 0 :(得分:2)

当您考虑继承时,python中的类方法更有意义。让我们使用一个更令人回味的示例:

假设您有一个Item类,该类代表杂货店中的某个商品。假设所有Item都可以装成两包。我们将使用返回元组的类方法来表示这一点。

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

现在,假设您想继承Item的类以真正代表特定项目,例如Soda

class Soda(Item):
    pass

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

这也触及了类方法的主要用途,它提供了构建对象的替代方法,因此您不仅限于__init__中的首选项

答案 1 :(得分:1)

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

在您的情况下,您要删除类方法并使用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

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