【问题标题】:python OOP, accessing attributespython OOP,访问属性
【发布时间】:2011-06-12 12:28:06
【问题描述】:

当我尝试从 NewOne 类访问属性 'self.b' 时,为什么会收到“AttributeError:'NewOne' 对象没有属性 'self.b'”错误消息。我的意思是它就在那里。

class NewOne(object):  
    def __init__(self):
        self.b = 'Cat' # this is what i want to access
    def child(self):
        self.c = 'kitten'
        return self.c

class FatherClass(object):
    def __init__(self, a):
        self.a = a
    def son(self):
        self.i = 'I and my father'
        return self.i
    def father(self):
        self.x = 'are one'
        return self.x
    def father_son(self):
        u = NewOne()
        k = getattr(u, 'self.b') #why does it tell me NewOne has no self.b attr
        return self.a, k()

getattr 不是用来访问方法的吗?为什么叫 getattr 而不是 getmeth 什么的? 谢谢

【问题讨论】:

    标签: python


    【解决方案1】:

    替换这个:

    k = getattr(u, 'self.b')
    

    通过这个:

    k = getattr(u, 'b')
    

    或者更好的做法是:

    k = u.b
    

    【讨论】:

    • 谢谢谢谢谢谢!如果属性和方法同名会怎样?
    • 属性和方法不能同名。更准确地说,方法一个属性,只是一个可调用的属性。
    • 不客气,它会被最后一个定义的覆盖,试试看:)
    【解决方案2】:

    你应该写

    k = getattr(u, 'b')
    

    或更好

    k = u.b
    

    改为。

    属性的名称是b,而不是self.b。通常您通过obj.attr 访问属性——getattr() 表单仅在属性名称是动态的(即在您编写代码时未知,但在运行时计算)时才需要。

    【讨论】:

    • “只有当属性的名称是动态的时才需要 getattr() 形式”这很有启发性。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-06-05
    • 2013-02-05
    • 2012-10-04
    • 1970-01-01
    • 2014-09-07
    • 2018-07-06
    • 1970-01-01
    • 2013-06-11
    相关资源
    最近更新 更多