Python类设计:属性

Python类设计:属性,python,class,Python,Class,我构建了一个类: 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

我构建了一个类:

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

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

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

定义一个小类数字,它将定义两个属性偶数和奇数 例如,数字可以将一个列表作为其uuu init_uuu的参数,偶数属性将仅返回此列表的偶数[i对于列表中的i,如果inti%2==0],并将奇数作为奇数

使用Foo.List在Foo.Numbers属性中创建一个数字实例来初始化它并返回此实例

正如建议的那样,您的Numbers类可以直接为内置列表类创建子类。你也可以这样定义它

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)
在这里,我们返回数字的表示形式作为其L属性列表的表示形式。在您想要将某些内容附加到一个数字实例之前,非常简单,例如:您必须定义一个Numb.append方法。。。坚持将数字作为列表的子类可能更容易:

 class Numbers(list):
    @property
    def even(self):
        ...
编辑:将//修改了%,因为我速度太快而且不够小心

您的numbers属性返回一个列表,所以numbers.odd不起作用

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

定义一个小类数字,它将定义两个属性偶数和奇数 例如,数字可以将一个列表作为其uuu init_uuu的参数,偶数属性将仅返回此列表的偶数[i对于列表中的i,如果inti%2==0],并将奇数作为奇数

使用Foo.List在Foo.Numbers属性中创建一个数字实例来初始化它并返回此实例

正如建议的那样,您的Numbers类可以直接为内置列表类创建子类。你也可以这样定义它

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)
在这里,我们返回数字的表示形式作为其L属性列表的表示形式。在您想要将某些内容附加到一个数字实例之前,非常简单,例如:您必须定义一个Numb.append方法。。。坚持将数字作为列表的子类可能更容易:

 class Numbers(list):
    @property
    def even(self):
        ...

编辑:将//修改了%,因为我走得太快,不够仔细

下面是一个愚蠢的例子:

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。因为我们的结构是list的一个子类,所以它实际上与Horray duck的真实类型无法区分!。如果您希望能够再次筛选mylst,mylst.odd甚至可以返回mylst的新实例,例如a.numbers.odd.in_fibinocci

,下面是一个愚蠢的示例:

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。因为我们的结构是list的一个子类,所以它实际上与Horray duck的真实类型无法区分!。如果您希望能够再次筛选mylst.odd.in_fibinocci,mylst.odd甚至可以返回mylst的一个新实例,例如a.numbers.odd.in_fibinocci

是的,但是如何获取inst.numbers仍然返回['12','45']。我想不出来…你的平均测试不应该在%2内。not int57//2不是int56//2应该返回True。是的,但如何获取inst.numbers仍然返回['12','45']。我想不出来…你的平均测试不应该在%2内。not int57//2不是int56//2应该返回True。我可以想出一些可怕的方法来实现这一点,但从列表继承是优雅的+1@JonClements-我很确定你可以用描述符做类似的事情,但我从来没有机会使用它们。从python内置类型继承就像pi一样简单!是的-可以使用描述符,如果它更复杂,很可能是一个实用的答案-但是在这个用例中,它是多余的,这个答案很好地解决了OPs问题;@乔恩·克莱门茨——你是对的,这是一个愚蠢的例子,但我试图在更抽象的层次上学习smth。我将尝试深入研究描述符,然后…我可以想出一些可怕的方法来实现这一点,但从列表继承是优雅的+1@JonClements-我很确定你可以用描述符做类似的事情,但我从来没有机会使用它们。从python内置类型继承就像pi一样简单!是的-可以使用描述符,如果它更复杂,很可能是一个实用的答案-但是在这个用例中,它是多余的,这个答案很好地解决了OPs问题;@乔恩·克莱门茨——你是对的,这是一个愚蠢的例子,但我试图在更抽象的层次上学习smth。那我就试着去挖掘描述符。。。