【问题标题】:enforcement for abstract properties in python3python3中抽象属性的强制执行
【发布时间】:2019-10-13 17:10:57
【问题描述】:

我有这个抽象类

class Kuku(ABC): 
    def __init__(self): 
        self.a = 4 
    @property 
    @abstractmethod 
    def kaka(self): 
        pass 

kaka 是一个抽象属性,所以我希望 python 强制它成为继承者中的一个属性,但它允许我创建:

class KukuChild(Kuku): 
     def kaka(self): 
         return 3

并且 KukuChild().kaka() 返回 3 ,就好像它不是属性一样。这是故意的吗? Pycharm 也不强制执行此操作,为什么还要在抽象类中添加 property 装饰器?

【问题讨论】:

    标签: python-3.x class oop properties abc


    【解决方案1】:

    您正在覆盖子类中的kaka 属性。您还必须使用@property 来装饰孩子中的重写方法:

    from abc import ABC, abstractmethod
    
    class Kuku(ABC): 
        def __init__(self): 
            self.a = 4 
        @property 
        @abstractmethod 
        def kaka(self): 
            pass 
    
    class KukuChild(Kuku): 
        @property
        def kaka(self): 
             return 3
    
    KukuChild().kaka    # <-- use as an attribute, not a method call.
    

    【讨论】:

    • 我知道我可以做到这一点,但 python 或 pycharm 也没有强制我这样做。有没有办法在不将kaka 实现为属性的情况下无法从Kuku 继承?
    • 我明白了;您可能可以使用专用的抽象元类...
    • OP 不是在问 如何 实现该属性,而是在问如何强制 它是一个属性
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 2012-07-09
    • 2023-01-27
    • 2011-09-28
    相关资源
    最近更新 更多