ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

如何从另一个对象的方法访问对象的属性,这是Python中的一个属性?

2019-07-10 13:08:46  阅读:161  来源: 互联网

标签:python oop composition


我想知道是否可能,如果是的话,如何在实现组合时访问“超级”类实例的属性.

下面提供的示例仅用于提供想法,并在进一步说明中设置共同点.

我希望直接从对象“门”(类型为DoorElement)访问MiniVan实例的“id”属性.

我的守则

class Car:
    def __init__(self, _id):
        self.id = _id


class CarElement:
    def __init__(self, name):
        self.name = name

    def get_car_id(self):
        # Body which will access value of attribute "id"
        return car_id


class MiniVan(Car):
    def __init__(self, _id):
        super(MiniVan, self).__init__(_id)
        self.door = DoorElement('door')
        self.engine = EngineElement('engine')


class DoorElement(CarElement):
    def __init__(self, name):
        super(DoorElement, self).__init__(name)


class EngineElement(CarElement):
    def __init__(self, name):
        super(EngineElement, self).__init__(name)


def main():
    mini_van = MiniVan(123)
    id_from_door = mini_van.door.get_car_id()
    id_from_engine = mini_van.engine.get_car_id()
    print(id_from_door) # Expected output 123
    print(id_from_engine) # Expected output 123


if __name__ == '__main__':
    main()

预期:

>打印两次“123”

我尝试过的:

>在创建对象期间传递必需属性

我知道我可以通过传递“car_id”来定义init方法,但出于某些原因,我希望尽可能避免使用它.如果没有,我会适当地去做.

>设置class属性,然后在classmethod中从CarElement类中调用它,例如:

@classmethod
def get_id(cls):
    return Car.id

但是这个解决方案的问题是,我可以为Car class(MiniVan,Truck等)提供许多子类,我希望它仍然有效.

>尝试使用描述符

def __get__(self, instance, owner):
    return instance.id

但我可以理解它是错误的,实际上getter(据我所知,干净的代码)应该返回一个类的实例,而不是任何属性.

附加信息

>我将始终使用CarElement(或子类)实例作为Car(或子类)实例的实例属性 – 不同的用法将被视为use-error
>可以有很多不同的Car类子类,但总是在继承方式(Car< - RacingCar(Car)< - FormulaOneCar(RacingCar))但没有组成

解决方法:

为了使代码正常工作,您必须使用car_id初始化所有CarElement-s.目前,您获得的错误来自于方法范围内缺少这样的变量.我对变化的想法是这样的:

class CarElement:
    def __init__(self, name, car_id):
        self.name = name
        self.car_id = car_id

    def get_car_id(self):
        # Body which will access value of attribute id
        return self.car_id

我看不到任何其他神奇的方式.

标签:python,oop,composition
来源: https://codeday.me/bug/20190710/1424357.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有