我发现从类的方法中调用方法时,不需要将任何变量传递给该方法。相反,在调用方法时,它仅从该方法继承属性。
class Person(object):
def method1(self):
print(self.attr1)
def method2(self):
self.attr1 = 'attr1'
self.method1()
这对我有用。但是,我的第一个直观尝试是由以下非功能性代码组成。
class Person(object):
def method1(self, attr1):
print(self.attr1)
def method2(self):
self.method1('attr1')
即使我找到了解决问题的方法,但我仍然非常有兴趣了解这一问题的基础。
编辑:我想理解的示例是这样的:
class Converter(object):
def split(self, x):
self.a, self.b, self.z, self.c = self.x.split(' ')
self.z = None
self.a = int(self.a)
def converter(self, unit, example):
self.x = ''
while self.x != 'exit':
self.x = input("Type '50 %s' or similar, or type 'units' to view valid units; type 'exit' to return to the main menu: " % (self.example))
if self.x == 'exit':
break
elif self.x == 'units':
print(list(self.units.keys()))
else:
self.split(self.x)
print(self.a / self.units[self.b] * self.units[self.c], self.c)
def volume(self):
self.units = { 'L': 1,
'mL': 1000,
'q': 1.05699,
'p': 2.11338,
'gal': 3.78541,
'oz': 33.814,
'ccm': 1000,
'cin': 61.024
}
self.example = 'L to q'
self.converter()
我不明白为什么这行不通:
class Converter(object):
def split(self, x):
self.a, self.b, self.z, self.c = self.x.split(' ')
self.z = None
self.a = int(self.a)
def converter(self):
self.x = ''
while self.x != 'exit':
self.x = input("Type '50 %s' or similar, or type 'units' to view valid units; type 'exit' to return to the main menu: " % (self.example))
if self.x == 'exit':
break
elif self.x == 'units':
print(list(self.units.keys()))
else:
self.split(self.x)
print(self.a / self.units[self.b] * self.units[self.c], self.c)
def volume(self):
self.units = { 'L': 1,
'mL': 1000,
'q': 1.05699,
'p': 2.11338,
'gal': 3.78541,
'oz': 33.814,
'ccm': 1000,
'cin': 61.024
}
self.converter({'L':2}, 'L to q')
EDIT2:好的,我想我现在明白了。属性被附加到实例对象,而我只是没有将传递给下一个函数的属性分配给实例对象。
python大神给出的解决方案
问题表达方式暗示您误解了属性的工作原理。属性与对象(类的实例)有关,而与方法无关。当您具有这样的方法时:
def method2(self):
self.attr1 = 'attr1'
self.method1()
self
引用您要在其上调用该方法的实例。例如,如果先执行bob = Person()
然后执行bob.method2()
,则self
将与bob
是同一对象。当您执行self.attr1 = 'attr1'
时,请在该对象上设置属性。如果随后调用method1
,则它可以访问对象上的所有属性。您没有放在其中的任何属性都不存在。
简而言之,如果您从不执行self.attr1 = whatever
,则尝试获取self.attr1
的值将永远无法进行。在第二个示例中,您从不执行self.attr1 = ...
,因此没有要获取的属性attr1
。
我同意zehnpaard的观点,即您使用相同的标签attr1
作为属性名称(self.attr1
),局部变量名称(attr1
)和字符串值('attr1'
)使事情变得混乱。将所有这些更改为不同的内容,您将开始了解它们的工作方式是否不同。