方法中的Python类属性

方法中的Python类属性,python,class,Python,Class,考虑下面的代码,我希望您解释为什么代码不起作用,因为我看到其他人在\uuuuu init\uuuu之外分配类属性,并且 从一个方法调用另一个方法中的属性,我的方法有什么问题。下面三个打印所有结果错误,表示该类没有任何属性 class Person(object): def __init__(self, age, height): self.age = age self.height = height def weight_kg(self):

考虑下面的代码,我希望您解释为什么代码不起作用,因为我看到其他人在
\uuuuu init\uuuu
之外分配类属性,并且 从一个方法调用另一个方法中的属性,我的方法有什么问题。下面三个打印所有结果错误,表示该类没有任何属性

class Person(object):
    def __init__(self, age, height):
        self.age = age
        self.height = height

    def weight_kg(self):
        self.weight = 60

    def ratio_kg2height(self):
        self.ratio = self.weight / self.height
        return self.ratio


mike = Person(23, 170)
print mike.weight
print mike.ratio_kg2height()
print mike.ratio

您没有在
\uuuu init\uuuu
方法中定义
weight
属性,因为在访问该属性之前,您不会调用
weight\u kg
方法,因此该属性不可用

您在这里有一些选项,基本的选项是首先初始化它,您只需在
\uuuu init\uuu
方法中调用您的方法:

class Person(object):
    def __init__(self, age, height):
        self.age = age
        self.height = height
        self.weight_kg()
        self.ratio_kg2height()

    ...

这里有一个

麦克风。在您调用
weight\u kg
之前,不会初始化重量。你需要把它变成一个属性。为什么你认为
weight
会被定义?在这种情况下,我什么时候应该像self.weight一样使用“隐藏属性”?@buzhidao“隐藏属性”是什么意思?如果您不希望出现属性错误,那么在定义属性之前不要尝试访问属性。这些不是隐藏属性,只是延迟初始化的属性。@juanpa.arrivillaga我应该在什么时候使用延迟初始化的属性?@buzhidao,当你确信你不需要它们的时候就使用它们,直到某个时候…这取决于你的代码的目的。我建议不要这样做,维护这类代码可能是一场噩梦,例如,想象一下一位同事在所有方法中搜索类的属性。最好显式声明它们,至少使用默认值、None或某种标志。