我构建了一个类:
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
操作?
最佳答案
您的 numbers
属性返回一个列表,因此 numbers.odd
不起作用。
但是,您可以遵循如下工作流程:
定义一个小类
Numbers
,它将定义两个属性even
和odd
例如,Numbers
可以将一个列表作为其__init__
的参数,even
属性将仅返回该列表的偶数[i for i in List if int(i)%2 == 0]
(以及奇数
奇数)...在
Foo.numbers
属性中创建Numbers
实例(使用Foo.List
对其进行初始化)并返回这个例子...
按照建议,您的 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
成为列表的子类:
class Numbers(list):
@property
def even(self):
...
已编辑:将 //
修正了 %
,因为我走得太快并且不够小心
关于Python类设计: attributes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12409332/