【问题标题】:Linter complaining when instance variable of subclass is another subclass instance, which can have different instance variables当子类的实例变量是另一个子类实例时,Linter抱怨,它可以有不同的实例变量
【发布时间】:2021-09-14 05:53:29
【问题描述】:

这有点令人困惑,我试图用简单的英语解释它,但很难理解。相反,我编写了以下玩具代码来说明问题。此代码运行良好并打印出预期的输出,但是我的 linter 抱怨显示的行。

  1. 这是 linter 的问题吗?
  2. 或者我可以做些什么来阻止 linter 抱怨这个吗?
  3. 或者这是不好的做法/设计,我应该以某种方式解决它?
from abc import ABC


class SuperClassVariable(ABC):
    def __init__(self, shared_value: str):
        self.shared_value = shared_value


class SubClassVariable1(SuperClassVariable):
    def __init__(self, shared_value: str, sub_class_value_1: str):
        super().__init__(shared_value=shared_value)
        self.sub_class_value_1 = sub_class_value_1


class SubClassVariable2(SuperClassVariable):
    def __init__(self, shared_value: str, sub_class_value_2: str):
        super().__init__(shared_value=shared_value)
        self.sub_class_value_2 = sub_class_value_2


class SuperClass(ABC):
    def __init__(self, sub_class_variable: SuperClassVariable):
        self.sub_class_variable = sub_class_variable


class SubClass1(SuperClass):
    def __init__(self, sub_class_variable: SubClassVariable1):
        super().__init__(sub_class_variable=sub_class_variable)


class SubClass2(SuperClass):
    def __init__(self, sub_class_variable: SubClassVariable2):
        super().__init__(sub_class_variable=sub_class_variable)


sub_class_variable_1 = SubClassVariable1(
    shared_value="shared_value", 
    sub_class_value_1="sub_class_variable_1"
)
sub_class_variable_2 = SubClassVariable2(
    shared_value="shared_value", 
    sub_class_value_2="sub_class_variable_2"
)

sub_class_1 = SubClass1(sub_class_variable=sub_class_variable_1)
sub_class_2 = SubClass2(sub_class_variable=sub_class_variable_2)

print(sub_class_1.sub_class_variable.shared_value)      # OK
print(sub_class_1.sub_class_variable.sub_class_value_1) # Cannot access member "sub_class_value_1" for type "SuperClassVariable"
print(sub_class_2.sub_class_variable.shared_value)      # OK
print(sub_class_2.sub_class_variable.sub_class_value_2) # Cannot access member "sub_class_value_1" for type "SuperClassVariable"

输出:

shared_value
sub_class_variable_1
shared_value
sub_class_variable_2

【问题讨论】:

    标签: python oop inheritance pylance


    【解决方案1】:

    我能够解决它,如图所示。不确定这是否是最好/正确的方法。我相信使用打字。泛型可能是解决此问题的更可接受的方法,但我更喜欢将超类名称显示为类型提示而不是泛型类型。

    from abc import ABC
    
    
    class SuperClassVariable(ABC):
        def __init__(self, shared_value: str):
            self.shared_value = shared_value
    
    
    class SubClassVariable1(SuperClassVariable):
        def __init__(self, shared_value: str, sub_class_value_1: str):
            super().__init__(shared_value=shared_value)
            self.sub_class_value_1 = sub_class_value_1
    
    
    class SubClassVariable2(SuperClassVariable):
        def __init__(self, shared_value: str, sub_class_value_2: str):
            super().__init__(shared_value=shared_value)
            self.sub_class_value_2 = sub_class_value_2
    
    
    class SuperClass(ABC):
        def __init__(self, sub_class_variable: SuperClassVariable):
            self.sub_class_variable = sub_class_variable
    
    
    class SubClass1(SuperClass):
        sub_class_variable: SubClassVariable1
    
        def __init__(self, sub_class_variable: SubClassVariable1):
            super().__init__(sub_class_variable=sub_class_variable)
    
    
    class SubClass2(SuperClass):
        sub_class_variable: SubClassVariable2
    
        def __init__(self, sub_class_variable: SubClassVariable2):
            super().__init__(sub_class_variable=sub_class_variable)
    
    
    sub_class_variable_1 = SubClassVariable1(
        shared_value="shared_value", 
        sub_class_value_1="sub_class_variable_1"
    )
    sub_class_variable_2 = SubClassVariable2(
        shared_value="shared_value", 
        sub_class_value_2="sub_class_variable_2"
    )
    
    sub_class_1 = SubClass1(sub_class_variable=sub_class_variable_1)
    sub_class_2 = SubClass2(sub_class_variable=sub_class_variable_2)
    
    print(sub_class_1.sub_class_variable.shared_value)      # OK
    print(sub_class_1.sub_class_variable.sub_class_value_1) # OK
    print(sub_class_2.sub_class_variable.shared_value)      # OK
    print(sub_class_2.sub_class_variable.sub_class_value_2) # OK
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-09
      • 2023-03-08
      • 1970-01-01
      • 2017-08-12
      • 1970-01-01
      • 2015-10-07
      • 2019-02-01
      • 2014-09-21
      相关资源
      最近更新 更多