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プロパティはリストを返すため、は機能しませnumbers.oddん。

ただし、次のようなワークフローに従うことができます。

  • Numbers2つのプロパティをeven定義する小さなクラスを定義しますodd 。たとえば、Numbersリストをその引数として取ることができる場合__init__、プロパティはこのリストの偶数(および奇数)evenのみを返します。[i for i in List if int(i)%2 == 0]odd

  • プロパティにのインスタンスを作成し(を使用しNumbersて初期化)、このインスタンスを返します...Foo.numbersFoo.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):
        ...

編集:私は速すぎて十分注意していなかったので、//によって修正しました%

于 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私たちの構造は list のサブクラスなので、事実上本物と見分けがつきません (ダックタイピング!)。 再度フィルタリングできるようにしたいmylst.odd場合は、 の新しいインスタンスを返すこともできます (例: )mylsta.numbers.odd.in_fibinocci

于 2012-09-13T15:17:36.570 に答える