python类中方法相互调用_在Python中的类方法中调用方法 - python

我发现从类的方法中调用方法时,不需要将任何变量传递给该方法。相反,在调用方法时,它仅从该方法继承属性。

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')使事情变得混乱。将所有这些更改为不同的内容,您将开始了解它们的工作方式是否不同。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值