什么时候使用实例?Python 3
我试图理解您何时需要类的实例,以及这两种代码变体之间的区别: 类A获取一个时间并将其分配给一个新变量,然后返回该新变量什么时候使用实例?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
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。这是一个常见的问题,我喜欢这篇文章的答案:。你如何调用这些方法?我在这里添加了对示例的调用,你的例子基本上太短/太简单,无法显示差异;事实上,你只需要使用一个普通函数。您需要一个更好的用例来显示差异。