为什么我们在Python中使用类?

为什么我们在Python中使用类?,python,Python,我正在学习Python中的类,我得到了一个非常基本的示例: class Person: def say_hi(self): print('Hello, how are you?') p = Person() p.say_hi() 作者表示,我们可以同样轻松地编写:Person()。说_hi() 那么,我们为什么不这样做,而不是在p变量上实例化Person类呢 经过深思熟虑,我想知道我们为什么需要上课。 我可以做say_hi()函数,根本不需要类。我意识到这是一门非常

我正在学习Python中的类,我得到了一个非常基本的示例:

class Person:
    def say_hi(self):
        print('Hello, how are you?')

p = Person()
p.say_hi()
作者表示,我们可以同样轻松地编写:
Person()。说_hi()

那么,我们为什么不这样做,而不是在
p
变量上实例化
Person
类呢


经过深思熟虑,我想知道我们为什么需要上课。
我可以做
say_hi()
函数,根本不需要类。我意识到这是一门非常简单的课程,但我想知道什么课程可以使用/什么时候是使用课程的合适时间?

这个问题确实太宽泛了,无法得到完整的答案,所以让我给你一个适合你例子范围的答案,而不是你问题的范围

正如一些评论者所注意到的,您使用类为您的函数提供一个有状态的环境来运行。例如,假设我想创建一个计数器。我可以使用全局变量和函数,如:

counter = 0
def increment_counter():
    global counter
    counter += 1
def decrement_counter():
    global counter
    counter -= 1
但这用两个额外的函数签名和一个变量污染了我们的名称空间。加上
global
关键字是一种代码气味,应尽可能避免。更不用说在整个代码库中只能有一个这样的计数器!如果您需要另一个,那么您必须重新键入所有代码,并违反DRY(不要重复您自己)

而是创建一个类:

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

所给出的示例经过简化,以说明类是如何工作的。若你们并没有附加任何状态(self.foo=bar),你们很少真正使用它们。详细回答:与所有其他面向对象语言使用类的原因相同。作者在撒谎。@Ben-我确实在撒谎,谢谢!它也可以是
Person.say_hi(p)
,以提供名为
self
的实例参数。但在这种情况下,由于没有状态,它应该只是一个函数。