为什么我不能有一个包含相同 class 的对象列表的 class?
Why can't I have a class which contains a list of objects of the same class?
我有以下 class:
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>]
正如那些注意的人所看到的,我是 运行 一个测试,我希望有 => 组列表 [<Group.Group object at 0x7ff54bb86350>]
,但它添加了所有的人对象作为嗯。
为了测试我的理智,我创建了另一个名为 Subgroup 的 class,现在它对我来说工作正常。但我想,在 Java 或 C++ 中我仍然可以做到这一点。为什么我不能使用 python?我不想创建另一个完全相同的 class!
这可能是您的问题。
class Group(object):
_name = '' # <--- variables defined here belong
_link = '' # <--- to the class itself, not to
_collection = [] # <--- class instances.
当你直接在 class 下定义变量时,它们实际上是 class 变量(类似于 Java 或 C++ 中的静态变量)。
打印集合时,请注意两行打印中的十六进制数相同。这可能是因为 group._collection
和 subGroup._collection
引用相同的列表(Group._collection
,在 class 级别定义的列表)。这就是您在列表中看到 Person
和 Group
的原因 - 您的子组正在向列表中添加 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
的列表。
我有以下 class:
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>]
正如那些注意的人所看到的,我是 运行 一个测试,我希望有 => 组列表 [<Group.Group object at 0x7ff54bb86350>]
,但它添加了所有的人对象作为嗯。
为了测试我的理智,我创建了另一个名为 Subgroup 的 class,现在它对我来说工作正常。但我想,在 Java 或 C++ 中我仍然可以做到这一点。为什么我不能使用 python?我不想创建另一个完全相同的 class!
这可能是您的问题。
class Group(object):
_name = '' # <--- variables defined here belong
_link = '' # <--- to the class itself, not to
_collection = [] # <--- class instances.
当你直接在 class 下定义变量时,它们实际上是 class 变量(类似于 Java 或 C++ 中的静态变量)。
打印集合时,请注意两行打印中的十六进制数相同。这可能是因为 group._collection
和 subGroup._collection
引用相同的列表(Group._collection
,在 class 级别定义的列表)。这就是您在列表中看到 Person
和 Group
的原因 - 您的子组正在向列表中添加 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
的列表。