【问题标题】:Clear all class variables between instances清除实例之间的所有类变量
【发布时间】:2010-03-24 21:30:07
【问题描述】:

这可能是一个愚蠢的问题,但是在实例之间清除类变量的最佳方法是什么?

我知道我可以在构造函数中单独重置每个变量;但是有没有办法批量做到这一点?

或者我做错了什么需要不同的方法?感谢您的帮助...

class User():
    def __init__(self):
        #RESET ALL CLASS VARIABLES

    def commit(self):
        #Commit variables to database

>>u = User()
>>u.name = 'Jason'
>>u.email = 'jason.mendez@yahoo.com.mx'
>>u.commit()

这样每次调用用户时,变量都是新鲜的。

谢谢。

【问题讨论】:

  • 这与当前的问题无关,但您应该始终继承 object 而不是什么都没有,以便您使用新型类。也就是说,你的sn-p的第一行会被改进为class User(object):

标签: python oop class pylons


【解决方案1】:

你可以像这样将参数传递给构造函数吗?

class User(object):
    def __init__(self, name, email):
        self.name = name
        self.email = email
    def commit(self):
        pass

jason = User('jason', 'jason@email.com')
jack = User('jack', 'jack@yahoo.com')

在您发布的代码中没有什么可以“重置”的。在构建用户时,他们甚至没有名称或电子邮件属性,直到您稍后设置它们。另一种方法是将它们初始化为一些默认值,如下所示,但我上面发布的代码更好,因此不会有任何未初始化的用户对象。

def __init__(self):
    self.user = None
    self.email = None

【讨论】:

  • 这是实现这样一个类的正确方法——传递值,而不是手动分配属性。
  • @Mike Graham,这是次优的,这就是为什么我说另一种方式更好。但是您并不总是将所有内容都传递给构造函数,所以我认为值得一提。
【解决方案2】:

如果您想在每次构造新对象时重置值,那么您应该使用实例变量,而不是类变量。

如果您使用类变量并尝试同时创建多个用户对象,那么其中一个会覆盖另一个的更改。

【讨论】:

  • 请注意,当前的 sn-p 没有使用类属性;它使用实例属性。你最后的说法是完全错误的。
  • @Mike Graham:我不认为他的 sn-p 是完整的(事实上,它甚至不会编译)。阅读 __init__ 方法中的 cmets - 他省略了一些使用类变量的代码。尽管如此,我还是试图澄清我的评论。
  • +1:“清除类变量”没有意义,因为这就是实例变量首先是的:每个实例都是新创建的变量。
  • @Mark Byers,设置u.name = 'Jason'等不会设置User的类属性,即使有同名的类属性。 (除非涉及一些魔法。)我认为他认为这是处理“类变量”的原因,他可能指的是实例属性、类属性,或者不知道他的意思。
  • @Mike Graham:是的,但也可能涉及其他变量,这些变量是类变量,但已从 sn-p 中省略。这个问题有两种解释方式,不可能说谁是“错的”。无论哪种方式,在我看来,任何没有解决关于类和实例变量的问题的答案都是一个不完整的答案。 OP 显然很困惑,无论我的解释是否正确,我仍然认为值得指出这一点以希望为 OP 澄清一些事情。
【解决方案3】:

在实例上绑定属性会创建实例属性,而不是类属性。也许您看到了上面代码中没有显示的另一个问题。

【讨论】:

    【解决方案4】:

    此代码不会更改User 的任何实例的nameemail 属性,u 除外。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-17
      • 2017-02-15
      • 1970-01-01
      • 1970-01-01
      • 2020-07-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多