我有一个问题。我正在看课程教程和跨类方法的摄像头。看完代码,可以更好地理解我的问题。我将首先显示代码。
代码:
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)
它们的工作原理相同。所以我的问题是,为什么还要使用类方法呢?
答案 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
引用)。可以在这里找到更详细的解释: