属性化对象能否访问其对象';python中的其他属性是什么?
我是python新手,如果这太糟糕,我会提前道歉 假设我动态地使一个对象成为另一个对象的属性。 指定为属性的对象是否可以访问指定给对象的其他属性的,而无需继承或作为参数传递 e、 g:- 我知道我可以将bill的健康作为损伤函数的参数:-属性化对象能否访问其对象';python中的其他属性是什么?,python,python-2.7,class,oop,object,Python,Python 2.7,Class,Oop,Object,我是python新手,如果这太糟糕,我会提前道歉 假设我动态地使一个对象成为另一个对象的属性。 指定为属性的对象是否可以访问指定给对象的其他属性的,而无需继承或作为参数传递 e、 g:- 我知道我可以将bill的健康作为损伤函数的参数:- class human: def __init__(self): self.health = 100 class fire: def __init__(self): self.fire = 10 def
class human:
def __init__(self):
self.health = 100
class fire:
def __init__(self):
self.fire = 10
def damage(self, obj):
obj.health -= self.fire
bill = human()
bill.fired = fire()
print bill.health
bill.fired.damage(bill) #now the fired object knows bill's health
print bill.health #works fine
但有没有其他办法,或者这是一条死胡同?除了遗产。
(我使用的是PythonV2.7,当然我也想知道v3解决方案)
如果这个问题太糟糕或者已经得到回答,我再次道歉。
我试着读这本书,但我听不懂,太复杂了。如果我用谷歌搜索这个问题,结果只会导致“如何访问对象属性”,例如这个。这一个使用继承。是的,您可以在创建
human
时将其传递到fire
,因为它们似乎彼此链接:
class人类:
定义初始化(自):
自我健康=100
火警类别:
定义初始(自我,人类):
自燃=10
self.human=人
def损坏(自):
self.human.health-=self.fire
比尔=人
bill.fired=火灾(bill)
bill.fired.damage()#被激发的对象会损害bill对象的健康
我不确定您的目标是什么,但正如我所提到的,您的问题在我看来像是一种代码味道(表明有些地方不对劲)
假设您希望<代码>人类< /代码>实例着火(即创建<代码>火灾< /代码>实例),然后推断火灾损害其健康,考虑下面的重构:
class human:
def __init__(self):
self.health = 100
self.fire = None
def set_on_fire(self):
self.fire = fire()
def suffer_burn_damage(self):
if self.fire is not None:
self.health -= self.fire.damage
class fire:
def __init__(self):
self.damage = 10
bill = human()
print(bill.health) # output: 100
bill.set_on_fire()
bill.suffer_burn_damage()
print(bill.health) # output: 90
这样一来,您就不需要通过fire
实例首先了解人类的健康状况。人类
的“工作”是跟踪它是否被烧毁,以及何时推断它自己的损失
这在更抽象的意义上也是有意义的——这也是使用OOP的要点之一。现实生活中的火有一定的能量。一个人一旦着火,他的“健康”就可以从火的能量中推断出来。fire本身不需要了解人类的健康或其他任何相关信息。因为这是Python,可能有一种(有点复杂的)方法可以做到这一点,但如果您当前的结构存在这种需要,您应该重新思考您的代码结构。我一直在尝试重新构造,但最终它是,要么是固定的函数,要么是复杂得模糊不清的类,要么是我使用字典或列表来存储某些数据的折衷方案。我不喜欢在类中使用字典或列表来处理某些数据,这样做可以吗?我不知道这是不是一个坏习惯。
class human:
def __init__(self):
self.health = 100
self.fire = None
def set_on_fire(self):
self.fire = fire()
def suffer_burn_damage(self):
if self.fire is not None:
self.health -= self.fire.damage
class fire:
def __init__(self):
self.damage = 10
bill = human()
print(bill.health) # output: 100
bill.set_on_fire()
bill.suffer_burn_damage()
print(bill.health) # output: 90