1

我构建了一个类:

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']

我怎样才能添加属性,所以我可以这样做inst.numbers.odd会返回['45']

4

2 回答 2

3

您的numbers属性返回一个列表,因此 anumbers.odd不起作用。

但是,您可以遵循如下工作流程:

  • 定义一个小类Numbers,它将定义两个属性evenodd 例如,Numbers可以将列表作为其参数__init__,该even属性将仅返回此列表的偶数[i for i in List if int(i)%2 == 0](和odd奇数)...

  • Numbers在你的Foo.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):
        ...

//已编辑:通过 a更正了%,因为我走得太快而且不够小心

于 2012-09-13T15:12:27.287 回答
2

这是一个愚蠢的例子:

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返回另一个列表的属性。由于我们的结构是列表的子类,它与真实的东西几乎没有区别(万岁鸭打字!)。 如果您希望能够再次过滤它,mylst.odd甚至可以返回一个新实例(例如)mylsta.numbers.odd.in_fibinocci

于 2012-09-13T15:17:36.570 回答