为什么我们在 Python 中使用类?
Why do we use classes in Python?
我正在学习 Python 中的类,我得到了一个非常基本的示例:
class Person:
def say_hi(self):
print('Hello, how are you?')
p = Person()
p.say_hi()
作者说我们可以很容易地写成:Person().say_hi()
那么,为什么我们不这样做而不是在 p
变量上实例化 Person
class?
经过反思,我想知道为什么我们需要 classes。
我可以在根本不需要 class 的情况下执行 say_hi()
功能。我意识到这是一个非常简单的 class 但我想知道 classes 可以用于什么/什么时候使用 class?
这个问题确实太宽泛了,无法得到完整的答案,所以让我给你一个适合你的例子范围的问题,而不是你的问题的范围。
正如一些评论者所注意到的,您使用 classes 为您的函数提供 运行 中的 stateful 环境。假设我想创建例如,一个柜台。我可以使用全局变量和函数,例如:
counter = 0
def increment_counter():
global counter
counter += 1
def decrement_counter():
global counter
counter -= 1
但这会用两个额外的函数签名和一个变量污染我们的命名空间。另外,global
关键字是一种代码异味,应尽可能避免。更不用说您在整个代码库中只能有一个这样的计数器!如果您需要另一个,则必须重新输入所有代码并违反 DRY(不要重复自己)。
相反,我们创建一个 class:
class Counter(object):
def __init__(self):
self.count = 0
# initialize count at zero
def increment(self, by=1):
self.count += by
def decrement(self, by=1):
self.count -= by
现在您可以根据需要多次实例化它,并且每个实例都会跟踪自己单独的计数,例如:
counter_a = Counter()
counter_b = Counter()
for _ in range(3):
counter_a.increment()
for _ in range(1000000):
counter_b.increment()
assert counter_a.count == 3
assert counter_b.count == 1000000
我正在学习 Python 中的类,我得到了一个非常基本的示例:
class Person:
def say_hi(self):
print('Hello, how are you?')
p = Person()
p.say_hi()
作者说我们可以很容易地写成:Person().say_hi()
那么,为什么我们不这样做而不是在 p
变量上实例化 Person
class?
经过反思,我想知道为什么我们需要 classes。
我可以在根本不需要 class 的情况下执行 say_hi()
功能。我意识到这是一个非常简单的 class 但我想知道 classes 可以用于什么/什么时候使用 class?
这个问题确实太宽泛了,无法得到完整的答案,所以让我给你一个适合你的例子范围的问题,而不是你的问题的范围。
正如一些评论者所注意到的,您使用 classes 为您的函数提供 运行 中的 stateful 环境。假设我想创建例如,一个柜台。我可以使用全局变量和函数,例如:
counter = 0
def increment_counter():
global counter
counter += 1
def decrement_counter():
global counter
counter -= 1
但这会用两个额外的函数签名和一个变量污染我们的命名空间。另外,global
关键字是一种代码异味,应尽可能避免。更不用说您在整个代码库中只能有一个这样的计数器!如果您需要另一个,则必须重新输入所有代码并违反 DRY(不要重复自己)。
相反,我们创建一个 class:
class Counter(object):
def __init__(self):
self.count = 0
# initialize count at zero
def increment(self, by=1):
self.count += by
def decrement(self, by=1):
self.count -= by
现在您可以根据需要多次实例化它,并且每个实例都会跟踪自己单独的计数,例如:
counter_a = Counter()
counter_b = Counter()
for _ in range(3):
counter_a.increment()
for _ in range(1000000):
counter_b.increment()
assert counter_a.count == 3
assert counter_b.count == 1000000