小编Arn*_*rne的帖子

Python:继承与组合

我正在使用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构造函数(组合)?

python inheritance composition

12
推荐指数
1
解决办法
1万
查看次数

我应该将Python列表子类化还是创建带有list作为属性的类?

我需要一个可以收集大量对象的容器,并在容器的元素上提供一些报告功能.基本上,我希望能够做到:

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)

我认为对列表进行子类化将是一个明智的选择.但这篇文章让这听起来像是禁忌.为什么?

python list subclass extend

8
推荐指数
2
解决办法
5196
查看次数

在Python中有效地创建(播种)大型词典

我有一个很长的(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 performance search dictionary

3
推荐指数
1
解决办法
2994
查看次数