我正在用Python编写一个脚本,使用的是FileHandler类的实例,但是即使没有分配给相同的变量,第二个脚本也会覆盖第一个脚本。
类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| class FileHandler():
name = None
path = None
@classmethod
def __init__(self,name,path):
self.name=name
self.path=path
@classmethod
def getName(self):
return self.name
@classmethod
def getPath(self):
return self.path |
脚本:
1 2 3 4 5 6 7
| import fileHandler
origen=fileHandler.FileHandler('a','b')
destino=fileHandler.FileHandler('c','d')
print origen.getName(),origen.getPath()
print destino.getName(),destino.getPath() |
结果:
- 因为你让它们成为类方法,self就是类。然后所有实例共享这些值。使用常规方法
- @Marco你认为@classmethod是做什么的?你认为类方法是什么?
- 停止使用classmethod
- 你的方法就是方法,不需要使用@classmethod,这是完全不同的。
- 如果您不知道某个特定的decorator是做什么的,为什么要在代码中使用它呢?
- 还有,这是Python。停止使用getter和setter。此外,您几乎肯定不希望创建name和path类级别的变量。这不是Java。去阅读Python中关于类定义的教程。
- @juanpa。arrivillaga—从技术上讲,在Python中使用@property装饰器仍然需要getter和setter,但是,没有添加特殊行为的冗余包装器方法是不必要的。
- @TigerhawkT3是的,是的。更准确的说法是"使用描述符协议来实现getter和setter"。但是,首先,我们需要清除这个Java。
- 谢谢,我改了。谢谢@juanpa。arrivillaga:)
您使用__init__方法作为class方法。
对每个方法使用@classmethod将导致一个单例,这就是为什么vars会覆盖。
- 如果我删除@classmethod,它似乎没有分配变量。现在的输出是:None,而不是旧值。
- 因为您创建了getter类方法(无论如何都不应该使用它)!因此,它们获得类级属性name和path,您已经明确地将它们设置为None。只需*删除代码中@classmethod的每次出现,并在类的顶部删除name = None和path = None。这不是创建实例属性的方法!