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