1

所以,我对 Python 还很陌生,我正在尝试了解 OOP 范式是如何在那里工作的。在这个阶段让我感到困惑的一件事是类变量。更具体地说,请考虑以下示例,该示例取自 Dusty Phillips 的Python 3 Object-Oriented Programming一书(第 3 章 - 当对象相似时):

class Contact:
    all_contacts = []

    def __init__(self, name, email):
        self.name = name
        self.email = email
        Contact.all_contacts.append(self)

因此,在这里我们看到一个简单的类示例,该类的类变量all_contacts是一个空列表。除此之外,还有两个实例变量nameemail. 现在,如果我们要创建类的两个不同实例Contact,例如

c1 = Contact('John', 'john@gmail.com')
c2 = Contact('Mark', 'mark@yahoo.com')

有两种方法可以访问属性nameemail,即

  1. c1.name
  2. c1.all_contacts[0].name

但这是我遇到问题的地方 -all_contacts是一个类变量,这意味着它对类的所有实例都是通用的Contact。不仅它对所有实例都是通用的,而且由于这个列表的填充方式,没有什么能阻止我这样做: c1.all_contacts[1].name 这给了我nameinstance 的属性c2。事实上,我似乎可以随心所欲地深入: c1.all.contacts[0].all_contacts[1].all_contacts[0]... 换句话说,我担心如果在 Python 中我们有一个带有类变量作为列表的类,然后在我们存储self到该列表的初始化方法中,是然后我们创建一个可以无限次引用自身的结构?有什么解决方法吗?

如果有人可以对此行为发表评论,我将不胜感激。

亲切的问候

4

0 回答 0