【问题标题】:How to access only the attributes from parent class?如何仅访问父类的属性?
【发布时间】:2021-08-31 08:49:41
【问题描述】:

我正在尝试编写父类的方法,该方法允许该类的任何子类返回定义为父类的一部分的属性。我可以想到一些 hacky/hardcodey 方法(使用 __dict__),但想知道更 Pythonic/正确的方法。

我想要做的一个例子是这样的:

class Parent:
    def __init__(self, var1=1, var2=2):
        self.var1 = var1
        self.var2 = var2

    def get_parent_attrs(self):
        # magic
        return dict_of_attrs

class Child(Parent):
    def __init__(self, var3=3, **kwargs):
        super().__init__(**kwargs)
        self.var3 = var3

所以可以这样使用:

child = Child(var1='a', var2='b', var3='c')
child.get_parent_attrs()
>>> {'var1':'a', 'var2':'b'}

或者更具体地说是这样的:

class OtherChild(Parent):
    def __init__(self, var4=4, **kwargs):
        super().__init__(**kwargs)
        self.var4 = var4

    def create_sibling(self, var3):
        return Child(var3=var3, **self.get_parent_attrs())


other_child = OtherChild(var1='a', var2='b', var4='d')
sibling = other_child.create_sibling(var3='c')

我可能正在思考错误的道路,所以如果我这样陈述我的问题可能会更好:如何在子类中编写一个方法,允许我实例化其他类(继承自同一个parent) 与用于实例化原始子类的父属性?

编辑: 我想我通过Get attributibutes in only base class (Python) 找到了解决方案 它将父属性存储在一个变量中。将看看这是否有效,并相应地更新/关闭我的问题

【问题讨论】:

    标签: python python-3.x oop attributes


    【解决方案1】:

    不确定这是否是您的目标,但您可以通过以下方式实现它:

    class Parent:
        def __init__(self, var1:str='', var2:str = ''):
            self.Var1 = var1
            self.Var2 = var2
    
        def get_parent_attrs(self):
            # magic
            print('Attributes of parent class are : ' + str(self.Var1) + ' and ' + str(self.Var2))
    
    class Child(Parent):
        def __init__(self,var1:str='', var2:str = '',var3:str=''):
            super().__init__(var1,var2)
            self.var3 = var3
    
    
    
    child = Child('a','b','c')
    child.get_parent_attrs()
    

    在这种情况下,我们得到:父类的变量是:a和b

    【讨论】:

    • 恐怕我正在寻找一个只返回与父类关联的属性的字典的东西,这样我就可以用它来实例化另一个也继承自同一个父类的对象,并且不需要专门对父类属性进行硬编码。
    【解决方案2】:

    在使用棉花糖的How to get attributes of parent class object only 上看到接受的答案后,我设法获得了所需的功能。此外,对于我的具体问题,它实际上对数据类和沙漠更有意义。

    以下是我如何解决特定问题的示例,但由于它没有回答我提出的更一般的问题,因此我不会接受它作为答案。

    import desert
    import dataclasses
    from dataclasses import dataclass
    from marshmallow import EXCLUDE, fields
    
    @dataclass
    class Parent:
        var1: int = dataclasses.field(
            metadata=desert.metadata(
                fields.Int(
                    missing=1
                )
            )
        )
        var2: int = dataclasses.field(
            metadata=desert.metadata(
                fields.Int(
                    missing=2
                )
            )
        )
    
        def create_sibling(self, sibling_class, attrs=None, **kwargs):
            if attrs is None:
                attrs = self.__dict__
            
            attrs = {**attrs, **kwargs}  
            
            schema = desert.schema(sibling_class, meta={'unknown': EXCLUDE})
            return schema.load(attrs)
    
    @dataclass
    class Child(Parent):
        var3: int = dataclasses.field(
            metadata=desert.metadata(
                fields.Int(
                    missing=3
                )
            )
        )
        
    
    
    @dataclass
    class OtherChild(Parent): 
        var4: int = dataclasses.field(
            metadata=desert.metadata(
                fields.Int(
                    missing=4
                )
            )
        )
    
    child = Child(var1=5, var2=6, var3=7)
    other_child = child.create_sibling(OtherChild, var4=8)
    
    print(other_child)
    >>> OtherChild(var1=5, var2=6, var4=8)
    
    
    # or with desert again to handle default params
    schema = desert.schema(Child)
    child = schema.load({})
    other_child = child.create_sibling(OtherChild, var4=8)
    print(other_child)
    >>> OtherChild(var1=1, var2=2, var4=8)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-24
      • 2016-02-11
      • 2015-02-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多