什么时候使用实例?Python 3

什么时候使用实例?Python 3,python,oop,Python,Oop,我试图理解您何时需要类的实例,以及这两种代码变体之间的区别: 类A获取一个时间并将其分配给一个新变量,然后返回该新变量 class A: def B(time): seconds = time return seconds seconds = A.B(int) 类C也需要一段时间,但也会创建函数D的实例(使用self),然后返回self.seconds class C: def D(self, time): self.second

我试图理解您何时需要类的实例,以及这两种代码变体之间的区别:

类A获取一个时间并将其分配给一个新变量,然后返回该新变量

class A:
    def B(time):
        seconds = time
        return seconds
seconds = A.B(int)
类C也需要一段时间,但也会创建函数D的实例(使用self),然后返回self.seconds

class C:
    def D(self, time):
        self.seconds = time
        return self.seconds

seconds = C().D(int)
它们最终返回相同的值。我很难理解这两段代码是如何不同的。在某些情况下,一方是否优于另一方

谢谢大家!

编辑:添加了对这两个函数的调用。

下面的(非常简化的)示例可能有助于了解类的实例在哪里有用:

class A:
    minutes = 2
    def time(seconds):
        return 60*A.minutes + seconds

class B:
    minutes = 2
    def time(self, seconds):
        return 60*self.minutes + seconds

print("Class:")
print(A.time(30))
a1 = A
a2 = A
a1.minutes = 3
a2.minutes = 4
print(a1.time(30))   # 60*4 + 30
print(a2.time(30))   # 60*4 + 30
print("Instance:")
print(B().time(30))
b1 = B()
b2 = B()
b1.minutes = 3
b2.minutes = 4
print(b1.time(30))   # 60*3 + 30
print(b2.time(30))   # 60*4 + 30
这导致:

Class:
150
270
270
Instance:
150
210
270

在核心部分,您所要求的是理解静态方法和普通方法之间的区别,以及OOP的优势

可以在不实例化类的情况下调用静态方法,例如在第一个示例中。这允许您将相关函数分组到单个标题(类)下,但从技术上讲,它不是OOP

但是,静态方法没有可操作的实例数据,因为没有实例

类实例允许您跟踪特定于对象的数据,并在方法中对其进行操作

例如:

import time

class Stopwatch:
    def __init__(self, name, start):
        self.name = name
        self.time = start
        self.active = False
    def start(self):
        self.active = True
    def stop(self):
        self.active = False
    def reset(self, time):
        self.time = time
    def isComplete(self):
        return (self.time == 0)
    def tick(self):
        if self.active:
            self.time -= 1
            print(self.name+": ",self.time)
            if self.time == 0:
                print("Timer of " + self.name + " has reached zero!")
                self.stop()

watchA = Stopwatch("A", 10)
watchB = Stopwatch("B", 5)

watchA.start()
watchB.start()

while (not watchA.isComplete()) or (not watchB.isComplete()):
    time.sleep(1)
    watchA.tick()
    watchB.tick()
运行此命令将输出:

A:  9
B:  4
A:  8
B:  3
A:  7
B:  2
A:  6
B:  1
A:  5
B:  0
Timer of B has reached zero!
A:  4
A:  3
A:  2
A:  1
A:  0
Timer of A has reached zero!

请注意,尽管使用相同的代码,但每个手表的时间是如何分别跟踪的。使用静态方法是不可能的,因为数据不是附加到类,而是附加到实例化对象本身。

在第一种情况下,
第二种情况下,
不绑定到类或Instance。这是一个常见的问题,我喜欢这篇文章的答案:。你如何调用这些方法?我在这里添加了对示例的调用,你的例子基本上太短/太简单,无法显示差异;事实上,你只需要使用一个普通函数。您需要一个更好的用例来显示差异。