为什么使用 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
我有一个问题。我正在观看 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