【问题标题】:How can I access a class data member from a method within the same class?如何从同一类中的方法访问类数据成员?
【发布时间】:2014-10-07 11:28:03
【问题描述】:
class Class:
    _member = 1

    def method(self):

我想从method() 中访问_member,这样做的正确方法是什么?

【问题讨论】:

    标签: python oop class-method class-attribute


    【解决方案1】:
    class Class:
        _member = 1
    
        @classmethod
        def method(cls):
            print cls._member
    
    Class.method()
    

    还有:

    >>> Class().method()
    1
    >>> 
    

    【讨论】:

    • 此外,使用classmethod更改类属性将确保该属性在实例中未被覆盖
    【解决方案2】:

    您可以使用self._member,如果它不是对象的属性(在self.__dict__ 中)我相信它会在类__dict__ 中查找,它应该包含类属性。

    【讨论】:

    • 是否意味着如果我使用method() 我也应该发送Class 的实例作为参数?
    • 不,只需从任何方法内部调用self._member。我只是指出,如果你在同名对象上设置一个属性,它将隐藏它,因为它会在类属性之前查找对象属性
    • 我完全理解你,只是当我尝试从创建Class 实例的脚本中使用method() 时,它告诉我method() 有两个参数,而我只提供了一个(我真正的method() 实际上采用一种方法,而不是像示例中那样没有)
    • @Quaker 是的,如果是staticmethod,那么它没有状态(没有自我),所以你可以丢失self 参数。发生这种情况的原因是您传递的参数被作为第一个参数 self 传递,而第二个参数未填充。
    • 请注意——self._member = 'value' 在实例方法中不会改变类属性,它会创建一个新的实例属性。
    【解决方案3】:
    class Class:
       _member = 1
    
       def method(self):
          print "value is ",self._member
    

    创建类的实例并调用方法

    c = Class()
    c.method()
    

    输出:

    value is 1
    

    【讨论】:

      【解决方案4】:
      class Class:
          _member = 1
      
          def method(self):
              print(Class._member)
      
      Class().method()
      

      会给出输出:

      1
      

      顺便说一句,那是一个类属性。您可以将该方法称为绑定方法。您可以选择静态方法(不需要第一个参数)、类方法(第一个参数是一个类)和普通方法(比如这个)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-06
        • 2015-04-22
        • 1970-01-01
        • 2012-11-06
        • 1970-01-01
        • 2022-01-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多