【问题标题】:Why is assert not working in abstract class?为什么断言在抽象类中不起作用?
【发布时间】:2019-12-13 14:36:08
【问题描述】:

我需要您的帮助来理解为什么assert 在我的代码中不起作用(我正在使用此代码来了解抽象类、getter 和 setter),我是抽象类的新手。

如果我在 power 属性上放置一个负数,代码应该停止并发出警告,但如果 power 是负数、零或非负数,断言会忽略。

另一个测试代码在基类中没有具体方法,但在子类中有相同的具体方法,代码停止并给我一个警告。

这是我完整的测试代码。

from abc import ABC, abstractmethod

class Load(ABC):
    #That's a class to create load to circuits.
    @abstractmethod
    def __init__(self, power=0, power_factor=1):
        self.__power = power
        self.__power_factor = power_factor

    # the attributte name and the method name must be  same
    # which is used to set the value for the attributte
    @property
    def power(self):
        return self.__power

    @power.setter
    def power(self, power):
        # AT TEST SHOULD STOP HERE ANY CONDITION - ONLY TEST PURPOSEs
        # BUT HERE ASSERT IS IGNORED
        assert (power < 0), "power must be non-negative"
        assert (power >= 0), "***power must be negative - ONLY TEST"
        self.__power = power

    @property
    def power_factor(self):
        return self.__power_factor

    @power_factor.setter
    def power_factor(self, power_factor):
        assert 0 < power_factor <= 1, "power factor must be greater 0 until 1"
        self.__power_factor = power_factor


class Specific(Load):
    def __init__(self, power, power_factor):
        super().__init__(power, power_factor)
    # the attributte name and the method name must be  same
    # which is used to set the value for the attributte

### ONLY TESTs PURPOSE

a = Specific(-11,1) # TO FORCE THE ERROR
print(a.power, a.power_factor)
a.power_factor = .4
print(a.power, a.power_factor)

我做错了什么?

【问题讨论】:

    标签: python class abstract assert assertion


    【解决方案1】:

    您没有使用您的设置器 - 您直接分配给您的支持字段。

    使用

    class Load(ABC):
        #That's a class to create load to circuits.
        @abstractmethod
        def __init__(self, power=0, power_factor=1):
            self.power = power                          # acutally use the setter, do not
            self.power_factor = power_factor            # set the backing field directly...
    

    所以你的设置器检查值。

    【讨论】:

    • 值得澄清的是,setter 和 getter 一旦存在就只能在 python 中工作的假设是可怕的。 python 中的 getter 和 setter 只是常规函数,如果您仍然可以直接访问值,那么您必须显式使用它们,如果您希望它们正常工作,甚至可能强制使用它们。
    猜你喜欢
    • 2022-08-04
    • 2012-09-30
    • 1970-01-01
    • 2012-02-06
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 2023-01-02
    相关资源
    最近更新 更多