我构造了一个类:
class Foo (object):
def __init__(self,List):
self.List=List
@property
def numbers(self):
L=[]
for i in self.List:
if i.isdigit():
L.append(i)
return L
@property
def letters(self):
L=[]
for i in self.List:
if i.isalpha():
L.append(i)
return L
>>> inst=Foo(['12','ae','45','bb'])
>>> inst.letters
['ae', 'bb']
>>> inst.numbers
['12', '45']如何添加属性才能执行返回['45']的inst.numbers.odd
发布于 2012-09-13 23:12:27
您的numbers属性返回一个列表,因此numbers.odd将不起作用。
但是,您可以遵循如下工作流程:
Numbers,它将定义两个属性even和odd例如,Numbers可以将一个列表作为其__init__的参数,even属性将只返回此列表实例的偶数(以及D11>的奇数)D15属性(使用D16对其进行初始化)中的D14实例,并返回此实例...H217F218您的Numbers类可以按照建议直接继承内置list类。你也可以像这样定义它
class Numbers(object):
def __init__(self,L):
self.L = L
@property
def even(self):
return [i for i in self.L if not int(i)%2]
def __repr__(self):
return repr(self.L)在这里,我们返回Numbers的表示形式作为其L属性(列表)的表示形式。很好,除非您想要向Numbers实例追加一些东西,例如:您必须定义一个Numb.append方法……将Numbers作为list的子类可能更容易:
class Numbers(list):
@property
def even(self):
...编辑:更正了%__的//,因为我走得太快了,不够小心
发布于 2012-09-13 23:17:37
下面是一个愚蠢的例子:
class mylst(list):
@property
def odd(self):
return [ i for i in self if int(i)%2 == 1 ]
class Foo(object):
def __init__(self,lst):
self.lst = list(lst)
@property
def numbers(self):
return mylst( i for i in self.lst if i.isdigit() )
a = Foo(["1","2","3","ab","cd"])
print(a.numbers)
print(a.numbers.odd)基本上,我们只是将list子类化,并添加一个返回另一个列表的属性odd。因为我们的结构是list的子类,所以它实际上与真实的东西(恐怖的鸭子类型!)难以区分。如果你想要再次过滤,mylst.odd甚至可以返回一个新的mylst实例(例如a.numbers.odd.in_fibinocci )
https://stackoverflow.com/questions/12409332
复制相似问题