Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么断言不能在抽象类中工作?_Python_Class_Abstract_Assert_Assertion - Fatal编程技术网

Python 为什么断言不能在抽象类中工作?

Python 为什么断言不能在抽象类中工作?,python,class,abstract,assert,assertion,Python,Class,Abstract,Assert,Assertion,我需要你的帮助来理解为什么assert在我的代码中不起作用(我用这段代码来学习抽象类、getter和setter),我是抽象类的新手 如果我在power属性中输入负数,代码应该停止并发出警告,但是assert会忽略power是负数、零或非负数 另一个测试代码在基类中没有具体的方法,但在子类中有相同的具体方法。代码停止并给我一个警告 下面是我要测试的完整代码 from abc import ABC, abstractmethod class Load(ABC): #That's a cl

我需要你的帮助来理解为什么
assert
在我的代码中不起作用(我用这段代码来学习抽象类、getter和setter),我是抽象类的新手

如果我在power属性中输入负数,代码应该停止并发出警告,但是assert会忽略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)
从abc导入abc,abstractmethod
班级负荷(ABC):
#这是一个创建回路负载的类。
@抽象方法
定义初始值(自,功率=0,功率因数=1):
自功率=功率
自功率因数=功率因数
#Attribute名称和方法名称必须相同
#用于设置属性的值
@财产
def电源(自):
返回自功率
@功率设定器
def电源(自身、电源):
#测试时应在此处停止任何条件-仅用于测试目的
#但是这里断言被忽略了
断言(幂<0),“幂必须是非负的”
断言(功率>=0),“***功率必须为负-仅测试”
自功率=功率
@财产
def功率因数(自身):
返回自功率因数
@功率因数整定器
def功率因数(自身、功率因数):

断言0 使用


因此,您的setter将检查这些值。

您没有使用setter,而是直接分配给支持字段

使用


因此,您的setter将检查这些值。

值得澄清的是,setter和getter一旦存在,就会在python中工作的假设是可怕的。python中的getter和setter只是常规函数,如果您仍然可以直接访问值,那么您必须显式地使用它们,如果您希望它们正常工作,甚至可能强制使用它们。值得澄清的是,setter和getter一旦存在,就可以在python中工作的假设是可怕的。python中的getter和setter只是常规函数,如果您仍然可以直接访问值,那么必须显式地使用它们,如果您希望它们正常工作,甚至可以强制使用它们。
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...