【问题标题】:Python: abstract instance variable?Python:抽象实例变量?
【发布时间】:2018-12-05 22:25:33
【问题描述】:

有没有办法在python中为类声明一个抽象实例变量?

例如,我们有一个抽象基类Bird,使用abc 包实现抽象方法fly,抽象实例变量feathers(我正在寻找)实现为一个属性。

from abc import ABCMeta, abstractmethod

class Bird(metaclass=ABCMeta):

    @property
    @abstractmethod
    def feathers(self):
        """The bird's feathers."""

    @abstractmethod
    def fly(self):
        """Take flight."""

问题是Eagle 是从Bird 派生的类,需要将feathers 实现为属性方法。所以以下不是可接受的课程,但我希望它是

class Eagle(Bird):

    def __init__(self):
        self.feathers = 'quill'

    def fly(self):
        print('boy are my arms tired')

可能存在问题,因为要求是在实例本身上,并且实际上是在实例化之后,所以我不知道像 abc 包这样的东西是否仍然有效。

有一些标准的处理方法吗?

【问题讨论】:

  • 也许我没抓住重点。您能简要解释一下为什么需要抽象属性吗?否则就让它成为一个正常的属性。
  • 我希望它被强制执行,这样如果 Eagle 实例没有 feathers 属性,就会引发一个有用的错误(以避免不可预测的行为)。 (如果您的意思更具体,对不起,但很难回答,因为我希望将它用于几个不同的变量。)

标签: python abstract-class python-3.6 instance-variables


【解决方案1】:

abc 系统不包含声明抽象实例变量的方法。确定类是具体还是抽象的代码必须在任何实例存在之前运行;它可以很容易地检查一个类的方法和属性,但它无法判断实例是否具有任何特定的实例属性。

最接近的可能是变量注解:

class Bird(metaclass=ABCMeta):
    feathers : str
    ...

abc 不会对该注释做任何事情,但它至少向读者和静态类型检查器表达了 Bird 的实例应该有一个 feathers 实例变量。 (静态类型检查器是否会理解这个实例变量应该来自子类,我不知道。)

【讨论】:

    【解决方案2】:

    像下面这样简单的东西可以工作,使用一个公共属性:

    class Bird(object):
        @property
        def feathers(self):
            try:
                return self._feathers
            except AttributeError:
                raise WhateverError('No feathers')  # maybe obfuscate inner structure
    
    class Eagle(Bird):
        def __init__(self):
            self._feathers = 'quill'
    
    >>> Bird().feathers
    WhateverError: No feathers
    >>> Eagle().feathers
    'quill'
    

    【讨论】:

      猜你喜欢
      • 2019-02-10
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多