为什么我不能拥有一个包含同一类对象列表的类?

时间:2015-02-01 20:42:36

标签: python class oop object

我有以下课程:

class Group(object):
    _name = ''
    _link = ''
    _collection = []

我有以下功能:

def getSubGroups(url, groups):
    group = groups[0]
    #sleep(15)
    html = requests.get(url+group.getLink())
    content = BeautifulSoup(html.text, "lxml")
    subGroup = None
    #Retrieving groups and people listed above these groups
    for div in content.find_all('div', {"class":["size14", "person-box"]}):
      #Group
      if "size14" in div.attrs['class']:
        if subGroup != None:
          #Adding a subgroup to its repective subgroup
          group.addCollection(subGroup)
          print 'NFL = ', group.getName()
          print '2014...', subGroup.getName()
          print 'List of groups', group.getCollection()
          print 'List of persons', subGroup.getCollection()
          break
        subGroup = Group()
        subGroup.setLink(div.a['href'])
        subGroup.setName(div.text)
      #Person
      if "person-box" in div.attrs['class']:
        divPerson = div.find('div', 'name')
        person = Person()
        person.setName(divPerson.text)
        person.setLink(divPerson.a['href'])
        #Adding a person to its repective group
        subGroup.addCollection(person)
    return group

该印刷品给出了以下输出:

NFL =  NFL Players 
2014... 2014 NFL Draft Picks and Rookies
List of groups [<Person.Person object at 0x7fd79a4bff50>, <Person.Person object at
0x7fd79a4bff90>, ..., <Group.Group object at 0x7fd79a4bff10>]
List of persons [<Person.Person object at 0x7fd79a4bff50>, <Person.Person object at
0x7fd79a4bff90>, ..., <Person.Person object at 0x7fd79a454990>,
<Group.Group object at 0x7fd79a4bff10>]

正如那些关注的人可以看到的那样,我正在进行一项测试,我希望能够拥有=&gt;组列表[<Group.Group object at 0x7ff54bb86350>],但它也添加了所有人物对象。

为了测试我的理智,我创建了另一个名为Subgroup的类,现在它对我来说很好。但是,我认为,在Java或C ++中,我可以做到这一点。为什么我不能使用python?我不想创建另一个完全相同的类!

1 个答案:

答案 0 :(得分:2)

这可能是你的问题。

class Group(object):
    _name = ''       #  <--- variables defined here belong
    _link = ''       #  <--- to the class itself, not to 
    _collection = [] #  <--- class instances.

当你直接在类这样的类下定义变量时,它们实际上是类变量(类似于Java或C ++中的静态变量)。

打印集合时,请注意两个打印行中的十六进制数字相同。这可能是因为group._collectionsubGroup._collection引用了相同的列表(Group._collection,即在类级别定义的列表)。这就是您在列表中看到PersonGroup的原因 - 您的子组正在向列表中添加Person个对象,而您的论坛正在添加Group个对象。

在python中,实例变量在__init__函数内定义(类似于Java / C ++中的构造函数)。

我怀疑你想做这样的事情:

class Group(object):
    def __init__(self):
        self._name = ''        # <--- variables defined here
        self._link = ''        # <--- belong to the instance only
        self._collection = []

然后,每当您说Group()时,您将创建一个新的Group对象,该对象具有名为_collection的列表。