Python类设计: attributes

标签 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
      @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,它将定义两个属性evenodd 例如,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/

相关文章:

python - TensorFlow:argmax(-min)

c++ - 为什么临时 'Test'没有移动,而只是构造?

默认为 'grandparent' 类实现的 Python 模式

class - 如何将数据从一个类复制到另一个类

python - 使用 subprocess.Popen() 从文件中读取 ssh 输入

python - Django:允许从 S3 下载各种媒体文件而无需创建模型(同时隐藏 s3 存储)

python - 在不安装模块的情况下从 Python 2.4 运行 MySQL 查询 (MySQLdb)

python - 如何使用 python API 将元字段添加到 Shopify 集合?

javascript - append 元素上的绑定(bind)方法

java - 未找到类异常hadoop