gpt4 book ai didi

python - 管理(和重命名)类组合的实例变量

转载 作者:太空宇宙 更新时间:2023-11-04 00:04:32 24 4
gpt4 key购买 nike

我想创建一个类组合,以便组合类的实例变量成为组合的实例变量,但名称经过调整。

这方面的应用是在 matplotlib 中定义用于绘图的新对象。一个示例是,我想要一个函数 drawMyArrow,它可以为箭头的头部、尾部和弧线绘制一个可能具有不同颜色(和其他规范)的箭头。我希望能够通过 drawMyArrow 中的关键字参数传递头部、尾部和圆弧的各种规范。我以前没有使用过类,但是在网上阅读这个,我相信解决我的问题的最好方法是定义一个类 MyArrow ,它是一些类 ArrowHead 的组合ArrowArc

为了说明我的问题,考虑一个简单的玩具示例。让我们定义一个类 Room,它由类 wallwindowdoor 组成。

class Door:
def __init__(self, color='white', height=2.3, width=1.0):
self.color = color
self.height = height
self.width = width

class Window:
def __init__(self, color='white', height=1.0, width=0.8):
self.color = color
self.height = height
self.width = width

class Wall:
def __init__(self, color='white', height=2.5, width=4.0):
self.color = color
self.height = height
self.width = width

class Room:
def __init__(self):
self.door = Door()
self.window = Window()
self.wall = Wall()

DoorWindowWall的实例变量分别是colorheight宽度。我希望 Room 具有实例变量 doorcolorwindowcolorwallcolordoorheight , windowheight 等。我可以将所有九个实例变量显式添加到 Room 并定义 setget 函数他们。但是,如果我后来决定向 DoorWindowWall 添加更多实例变量,我将始终需要编辑 的代码房间 也是。有没有办法对 Room 进行编码,使其自动采用(并重命名)其组件类中的实例变量?

最佳答案

您正在使用组合——无需为您的成员复制访问器。您可以通过您的组合成员轻松访问属性:

r = Room()
print( r.window.color ) # to print the windows color only

不过,您可能会从“零件”的基类和 Room 类的更改后的 __init__(..) 中获益:

class Thing:
"""Base class handling init including a name and __str__ and __repr__."""
def __init__(self, name, color, height, width):
self.name = name
self.color = color
self.height = height
self.width = width

def __str__(self):
return repr(self)

def __repr__(self):
return str([self.name, self.color, self.height, self.width])

class Door(Thing):
def __init__(self, color='white', height=2.3, width=1.0):
super(self.__class__, self).__init__(self.__class__.__name__, color, height, width)

class Window(Thing):
def __init__(self, color='white', height=2.3, width=1.0):
super(self.__class__, self).__init__(self.__class__.__name__, color, height, width)

class Wall(Thing):
def __init__(self, color='white', height=2.5, width=4.0):
super(self.__class__, self).__init__(self.__class__.__name__, color, height, width)

class Room:
def __init__(self,*, door=None, window=None, wall=None): # named params only
self.door = door or Door() # default to booring Door if none provided
self.window = window or Window() # same for Window
self.wall = wall or Wall() # same for Wall

def __str__(self):
return str([self.door,self.window,self.wall])

创建对象并打印它们:

r = Room()
r2 = Room(window=Window("yellow"))

print(r)
print(r2)

r3 = Room( window=Window("green",0.5,0.5), door=Door("black",5,5),
wall=Wall("unicorncolored",5,5) )

print(r3)

输出:

# r - the cheap Room - using default-ing Things
[['Door', 'white', 2.3, 1.0], ['Window', 'white', 2.3, 1.0], ['Wall', 'white', 2.5, 4.0]]

# r2 - with a custom yellow Window
[['Door', 'white', 2.3, 1.0], ['Window', 'yellow', 2.3, 1.0], ['Wall', 'white', 2.5, 4.0]]

# r3 - all custom -
[['Door', 'black', 5, 5], ['Window', 'green', 0.5, 0.5], ['Wall', 'unicorncolored', 5, 5]]

关于python - 管理(和重命名)类组合的实例变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54611325/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com