【问题标题】:Why are instances of this class being overwritten? [duplicate]为什么这个类的实例被覆盖? [复制]
【发布时间】:2017-07-07 09:43:52
【问题描述】:

我正在使用 FileHandler 类的实例使用 Python 编写脚本,但第二个会覆盖第一个,即使没有分配给相同的变量。

班级:

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

脚本:

import fileHandler 

origen=fileHandler.FileHandler('a','b')
destino=fileHandler.FileHandler('c','d')

print origen.getName(),origen.getPath()
print destino.getName(),destino.getPath()

结果:

c d
c d

【问题讨论】:

  • 因为你让它们成为类方法,所以那里的自我就是类。然后所有实例共享这些值。只需使用常规方法
  • @Marco 你认为@classmethod 做了什么,你认为什么是类方法?
  • 停止使用类方法
  • 你的方法无论如何都是方法,不需要使用@classmethod,那是完全不同的东西。
  • @TigerhawkT3 是的,是的。更准确的说法是“使用描述符协议实现getter和setter”。但是小步骤,首先,我们需要将 Java 清除掉。

标签: python class


【解决方案1】:

您正在使用__init__ 方法作为class 方法。

对每个方法使用@classmethod 将导致单例,这就是变量覆盖的原因。

【讨论】:

  • 如果我删除 @classmethod 似乎没有分配变量。现在的输出是:无而不是旧值。
  • @MarcoAntonioAraújoMatarazzo *因为你创建了你的 getter(无论如何你都不应该使用)类方法!因此,它们获得了类级别属性namepath,您已明确将其设置为None。只需 * 删除代码中出现的所有 @classmethod,并删除类顶部的 name = Nonepath = None。这不是你制作实例属性的方式!
猜你喜欢
  • 2015-06-18
  • 2012-09-27
  • 1970-01-01
  • 2019-03-03
  • 1970-01-01
  • 2012-05-29
  • 2020-03-06
  • 1970-01-01
  • 2012-11-05
相关资源
最近更新 更多