Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如何实现';流行音乐';在这个班?_Python - Fatal编程技术网

Python:如何实现';流行音乐';在这个班?

Python:如何实现';流行音乐';在这个班?,python,Python,我想让这门课表现得像一个列表。它的数据驻留在属性self.data中。 如果我有一个实例,pp=population,那么定义\uu getitem\uu是否意味着我可以引用 pp而不是pp数据?或者是对\uuuu repr\uuuu的定义导致了这种情况? 从list而不是object派生这个类会给我提供“pop”吗。 现在我需要实现“pop”方法。谢谢 class population (object): def __init__ (self): self.data = [] def

我想让这门课表现得像一个列表。它的数据驻留在属性self.data中。 如果我有一个实例,pp=population,那么定义
\uu getitem\uu
是否意味着我可以引用 pp而不是pp数据?或者是对
\uuuu repr\uuuu
的定义导致了这种情况? 从list而不是object派生这个类会给我提供“pop”吗。 现在我需要实现“pop”方法。谢谢

class population (object):
def __init__ (self):
    self.data = []

def append(self, item):
    self.data.append(item)

def extend(self, item):
    self.data.extend(item)

def sort(self):
    self.data.sort(cmp=fitnesscompare)

def __getitem__(self, index): return self.data[index]

def __setitem__(self, index, item): self.data[index] = item

def __len__(self): return len(self.data)

def __repr__(self): return repr(self.data)

def copy(self):
    return copy.deepcopy(self)

为什么不扩展list类呢?然后您就拥有了所有内置的功能

class population(list):
    # custom methods here

请记住,不要为列表引用
self.data
,只需引用
self

为什么不扩展list类?然后您就拥有了所有内置的功能

class population(list):
    # custom methods here
def pop(self, index=-1) :
    return self.data.pop(index)
请记住,不要为列表引用
self.data
,只需引用
self

def pop(self, index=-1) :
    return self.data.pop(index)
这将实现预期的行为:

  • 如果未传递索引,则返回最后一项
  • 如果通过,返回“索引”处的项目
  • 将使用基础pop()的类型检查
  • 将引发与基础pop()相同的异常
我会像埃文·福斯马克之前建议的那样对这个列表进行分类,但我可以看到不这样做的充分理由。组合可以缓解低耦合,您可以完全控制它。但是你必须为你想委托的所有方法编写桥梁,这可能是一件痛苦的事

这将实现预期的行为:

  • 如果未传递索引,则返回最后一项
  • 如果通过,返回“索引”处的项目
  • 将使用基础pop()的类型检查
  • 将引发与基础pop()相同的异常
我会像埃文·福斯马克之前建议的那样对这个列表进行分类,但我可以看到不这样做的充分理由。组合可以缓解低耦合,您可以完全控制它。但是你必须为你想委托的所有方法编写桥梁,这可能是一件痛苦的事

如果我有一个实例,pp=population,那么定义
\uu getitem\uu
是否意味着我可以引用pp而不是pp.data

基本上,是的。添加
\uuu getitem\uuu
方法相当于在某些其他语言中重载[]运算符。因此,以下两项是等效的:

pp.data[0]
pp[0]
repr(pp.data)
repr(pp)
或者是对
\uuuu repr\uuuu
的定义导致了这种情况

定义
\uuuu repr\uuuu
将为您提供对象的字符串表示。因此,这两个调用是等效的:

pp.data[0]
pp[0]
repr(pp.data)
repr(pp)
从list而不是object派生这个类会给我提供“pop”吗

从我现在看到的情况来看,从列表继承可能是一条路。除非我遗漏了什么,唯一不同的是排序方法和复制。其他一切都是一样的

如果我有一个实例,pp=population,那么定义
\uu getitem\uu
是否意味着我可以引用pp而不是pp.data

基本上,是的。添加
\uuu getitem\uuu
方法相当于在某些其他语言中重载[]运算符。因此,以下两项是等效的:

pp.data[0]
pp[0]
repr(pp.data)
repr(pp)
或者是对
\uuuu repr\uuuu
的定义导致了这种情况

定义
\uuuu repr\uuuu
将为您提供对象的字符串表示。因此,这两个调用是等效的:

pp.data[0]
pp[0]
repr(pp.data)
repr(pp)
从list而不是object派生这个类会给我提供“pop”吗


从我现在看到的情况来看,从列表继承可能是一条路。除非我遗漏了什么,唯一不同的是排序方法和复制。其他一切都是一样的。

这真的是一个事物的列表,还是你用一个列表来存储一堆事物?在从列表继承之前,为什么不使用列表呢

我试着为真正的is-a关系保留继承权。表单是一个窗口,对话框是一个表单,等等。如果您只是使用A来建模is-implemented,那么只需使用基类,或者使用包含和委派


对于一个不仅仅是列表的人群来说,这是什么呢?

这真的是一个事物的列表,还是你用一个列表来存储一堆事物?在从列表继承之前,为什么不使用列表呢

我试着为真正的is-a关系保留继承权。表单是一个窗口,对话框是一个表单,等等。如果您只是使用A来建模is-implemented,那么只需使用基类,或者使用包含和委派


对于一个不仅仅是一个列表的人口来说,有什么意义呢?

是的,这很有效。我不得不添加“复制”方法,谢谢,效果很好。我必须添加“复制”方法,谢谢。我会试试这个。I子类总体(列表)。它的一个实例有一个“染色体”类实例的集合,这些实例本身是不可编辑的。但当我尝试“instOfPopulation.pop()”时,我得到了“TypeError:“Chromose”对象不可移植”我真的不知道出了什么问题,子类化还是我的解决方案?最后,fosmark解决方案不起作用吗?在这种情况下,它应该被接受。我仍然无法在人口类上使用'pop()'。当我尝试使用您的方法时,出现了以下错误消息:“文件”C:\Python26\Code\OO.py”,第201行,在pop return self.pop(index)中,并滚动到“超过最大递归深度”。我很困惑,为什么一个列表不会“pop()”它的内容并返回一个错误,即内容本身不可编辑。我是stackoverflow的新手,没有意识到我应该接受答案。我能够按照fosmark的建议对list进行子类化,但仍然无法在填充上实现“pop()”。我很抱歉。我试图使用“extend()”将“pop()”的返回值分配给一个列表,正是这个返回值引发了错误。因此,福斯马克的解决方案奏效了。感谢所有回应的人。我会试试这个。I子类总体(列表)。它的一个实例有一个“染色体”类实例的集合,这些实例是n