我正在使用Python中的两个类,其中一个应该被允许将来自另一个类的任何数字对象作为子项,同时将这些子项的清单作为属性保留.继承似乎是这个父<>孩子情况的明显选择,而是我所得到的是一个组合的例子.这是简化的代码:
class Parent():
def __init__(self,firstname,lastname):
self.firstname = firstname
self.lastname = lastname
self.kids = []
def havechild(self,firstname):
print self.firstname,"is having a child"
self.kids.append(Child(self,firstname))
class Child(Parent):
def __init__(self,parent,firstname):
self.parent = parent
self.firstname = firstname
self.lastname = parent.lastname
Run Code Online (Sandbox Code Playgroud)
所以基本上,虽然从Child()继承Child()似乎直觉上有意义,但删除继承并不会改变任何东西.我可以看到离开Child(Parent)而不仅仅是类Child()的唯一好处是,如果我需要向Parent添加更多方法,我希望Child继承.使用self.parent = parent,我已经可以访问Parent的任何其他未来属性.
有没有其他方法可以使用纯继承而不是将Parent实例传递给Child构造函数(组合)?
我需要一个可以收集大量对象的容器,并在容器的元素上提供一些报告功能.基本上,我希望能够做到:
magiclistobject = MagicList()
magiclistobject.report() ### generates all my needed info about the list content
Run Code Online (Sandbox Code Playgroud)
所以我想到了对普通列表进行子类化并添加了一个report()方法.这样,我就可以使用所有内置列表功能.
class SubClassedList(list):
def __init__(self):
list.__init__(self)
def report(self): # forgive the silly example
if 999 in self:
print "999 Alert!"
Run Code Online (Sandbox Code Playgroud)
相反,我也可以创建我自己的具有magiclist属性的类,但是如果我想使用以下命令到达列表,我将不得不创建新的方法来追加,扩展等.
magiclistobject.append() # instead of magiclistobject.list.append()
Run Code Online (Sandbox Code Playgroud)
我需要这样的东西(这似乎是多余的):
class MagicList():
def __init__(self):
self.list = []
def append(self,element):
self.list.append(element)
def extend(self,element):
self.list.extend(element)
# more list functionality as needed...
def report(self):
if 999 in self.list:
print "999 Alert!"
Run Code Online (Sandbox Code Playgroud)
我认为对列表进行子类化将是一个明智的选择.但这篇文章让这听起来像是禁忌.为什么?
我有一个很长的(500K +行)两列电子表格,如下所示:
Name Code
1234 A
1234 B
1456 C
4556 A
4556 B
4556 C
...
Run Code Online (Sandbox Code Playgroud)
因此,有一个元素(带有名称)可以有许多代码.但是,每个代码不是一行,而是希望列出每个元素发生的所有代码.我想要的是这样的字典:
{"1234":["A","B"],"1456":["C"],"4556":["A","B","C"] ...]}
Run Code Online (Sandbox Code Playgroud)
我试过的是这个(我不包括文件读取语法).
codelist = {}
for row in rows:
name,code = well.split()
if name in codelist.keys():
codelist[name].append(code)
else:
codelist[name] = [code]
Run Code Online (Sandbox Code Playgroud)
这会产生正确的输出,但进度变得非常慢.所以我尝试用键启动我的字典:
allnames = [.... list of all the names ...]
codelist = dict.fromkeys(allnames)
for row in rows:
name,code = well.split()
if codelist[name]:
codelist[name].append(code)
else:
codelist[name] = [code]
Run Code Online (Sandbox Code Playgroud)
这要快得多,我的问题是为什么?每次程序是否仍然必须搜索dict中的所有键?还有另一种方法来加速不包括遍历树的字典搜索吗?
有趣的是我在使用相同的条件检查时得到的错误(如果在codelist.keys():)中引用我的字典之后的名字.
Traceback (most recent call last):
File ....
codelist[name].append(code)
AttributeError: 'NoneType' object …Run Code Online (Sandbox Code Playgroud) python ×3
composition ×1
dictionary ×1
extend ×1
inheritance ×1
list ×1
performance ×1
search ×1
subclass ×1