python - 如何在 python 中使用 abstractproperty 装饰器强制子类设置属性?

标签 python python-2.7 abstract-class

我想强制一个 Child 类设置几个属性(实例变量),以实现我在 python 2.7 中使用 abstractproperty 装饰器。这是示例代码:

from abc import ABCMeta, abstractproperty
class Parent(object):
    __metaclass__ = ABCMeta
    @abstractproperty
    def name(self):
        pass

class Child1(Parent):
    pass

class Child2(Parent):
    name = 'test'

class Child3(Parent):
    def __init__(self):
        self.name = 'test'

obj_child1 = Child1()

Child1 对象创建会按预期出现错误。

obj_child2 = Child2()

Child2 对象创建工作正常,因为设置了抽象属性“名称”

不过

 obj_child3 = Child3()

给出 TypeError: Can't instantiate abstract class Child3 with abstract methods name

没看懂:虽然在init中设置了'name'属性 方法,为什么创建 Child3 对象会抛出类型错误。

我的要求是在子类的方法中设置属性。解释 child2 类有什么问题,以及是否有更好的方法强制子类在方法中设置属性将对我有所帮助。提前致谢。

最佳答案

一个更简单的解决方案是

class Parent(object):
    name = None
    def __init__(self):
        if self.name == None:
            raise NotImplementedError('Subclasses must define bar')

class Child1(Parent):
    pass

class Child2(Parent):
    name = 'test'

class Child3(Parent):
    def __init__(self)
        self.name = 'test'

obj1 = Child1() 引发 NotImplementedError

obj2 = Child2() 工作正常

obj3 = Child3() 工作正常。这就是您需要强制子类设置属性 name 并通过方法设置属性。

关于python - 如何在 python 中使用 abstractproperty 装饰器强制子类设置属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41695875/

相关文章:

multithreading - 是否有适用于 Python 2.7 的 ereporter 版本

java - 从java/kotlin中的父抽象类数组调用子类函数

python - 如何从 Tkinter 条目小部件获取字节数组

python - 如何从字典列表中删除重复的字典对象

python - 如果密码正确,如何发现 'Access granted' 被打印了 3 次?

C++ 抽象类和继承

Java 抽象类 - 我怎样才能最好地解决这个问题?

python - 如何使用 keras.backend.gradients() 获取梯度值

python - Django 切断上传的文件

python - 如何在没有 Sprite 的情况下在Pygame中实现跳跃?