Python 使用相同的抽象函数从父属性调用子函数

Python 使用相同的抽象函数从父属性调用子函数,python,abstract,Python,Abstract,我需要父级中的设置来包含子级中的函数。(此父级的每个子级都将使用该设置,但函数的定义方式将更改) 这可能吗?当前它似乎从父类读入未定义的函数(因此中断) 从 无法实例化从ABCMeta派生的元类,除非 它的抽象方法和属性被重写 我将创建基类的方式更改为classmine(metaclass=ABCMeta): 并收到错误信息 Traceback (most recent call last): File "g.py", line 24, in <module> Child

我需要父级中的设置来包含子级中的函数。(此父级的每个子级都将使用该设置,但函数的定义方式将更改)

这可能吗?当前它似乎从父类读入未定义的函数(因此中断)

无法实例化从ABCMeta派生的元类,除非 它的抽象方法和属性被重写

我将创建基类的方式更改为
classmine(metaclass=ABCMeta):
并收到错误信息

Traceback (most recent call last):
  File "g.py", line 24, in <module>
    Child().settings
TypeError: Can't instantiate abstract class Child with abstract methods settings
更新

这不仅仅是ABC的问题。任何重写属性方法的子类都有这个问题。在这里,我试图覆盖一个getter,但发现仍然得到了父视图:

>>> class Foo:
...     def __init__(self, val):
...         self._val = val
...     def _get_val(self):
...         return self._val
...     def _set_val(self, val):
...         self._val = val
...     val = property(_get_val, _set_val)
... 
>>> class Bar(Foo):
...     def _get_val(self):
...         return self._val + 2
... 
>>> print('want 3, got', Bar(1).val)
want 3, got 1
更新2

问题是
property
在定义类方法时绑定了它。如果您不介意实现中间函数,那么您可以让它们在子函数重写它们之后在运行时解析目标方法。在这里,
\u get\u stuff
在运行时调用
\u get\u stuff\u impl
,得到子版本

from abc import ABCMeta,abstractmethod

class Mine(metaclass=ABCMeta):
    def _get_stuff(self):
        return self._get_stuff_impl()

    @abstractmethod
    def _get_stuff_impl(self):
        raise NotImplementedError()

    def _set_stuff(self, value):
        return self._set_stuff_impl(value)

    @abstractmethod
    def _set_stuff_impl(self, value):
        raise NotImplementedError()

    settings = property(_get_stuff, _set_stuff)

    def do_stuff_with_settings(self):
        return settings

class Child(Mine):
    def _get_stuff_impl(self):
        return 1
    def _set_stuff_impl(self):
        pass
#    settings = property(_get_stuff, _set_stuff)

Child().settings

通过这样做,您试图回避什么问题?有许多通用函数(每个子函数都相同)使用该设置。我不希望那些函数引用父级中不存在的变量(尽管python不会抱怨)。可以
do\u stuff\u with\u settings
返回属性(self.\u get\u stuff,self.\u set\u stuff)
有一系列函数可以
使用设置填充,它们都可以访问设置中包含的参数,而“get”则从另一个函数中检索值字典dictionary@north.mister-如果您想使用属性,那么是的,这是唯一的方法。父
settings=property(\u get\u stuff,\u set\u stuff)
绑定到父方法。它也不是一个真正的抽象方法。如果任何子类重写属性实现函数,您都会遇到同样的问题。@north.mister-您可以玩这个系统,不过。。。我提供了一个更新示例。
>>> class Foo:
...     def __init__(self, val):
...         self._val = val
...     def _get_val(self):
...         return self._val
...     def _set_val(self, val):
...         self._val = val
...     val = property(_get_val, _set_val)
... 
>>> class Bar(Foo):
...     def _get_val(self):
...         return self._val + 2
... 
>>> print('want 3, got', Bar(1).val)
want 3, got 1
from abc import ABCMeta,abstractmethod

class Mine(metaclass=ABCMeta):
    def _get_stuff(self):
        return self._get_stuff_impl()

    @abstractmethod
    def _get_stuff_impl(self):
        raise NotImplementedError()

    def _set_stuff(self, value):
        return self._set_stuff_impl(value)

    @abstractmethod
    def _set_stuff_impl(self, value):
        raise NotImplementedError()

    settings = property(_get_stuff, _set_stuff)

    def do_stuff_with_settings(self):
        return settings

class Child(Mine):
    def _get_stuff_impl(self):
        return 1
    def _set_stuff_impl(self):
        pass
#    settings = property(_get_stuff, _set_stuff)

Child().settings