Python类变量与实例变量及成员函数修饰方式说明(与Java定义方式进行类比)

  • Python类中的变量有类变量和实例变量之分。

  • 类变量:变量绑定在类上,同一个类之间的共享变量,类比于Java中的静态变量static

    • 公有变量定义

      • Java 的定义方式

        class Test{
            public static class_variable = "123"
        }
        
      • Python3 定义方式

        class Test: 
            class_variable = "123"
        
    • 私有变量定义

      • Java 的定义方式

        class Test{
            private static class_variable = "123"
        }
        
      • Python3 定义方式

        class Test: 
            __class_variable = "123"
        
  • 实例变量:变量绑定在类的实例上,同一个类的不同实例之间不共享,类比于Java中的成员变量

    • 公有变量定义

      • Java 的定义方式

        class Test{
            public instance_variable = "123"
        }
        
      • Python3 定义方式

        class Test: 
            def __init__(self): 
                self.instance_variable = "123"
        
    • 私有变量定义

      • Java 的定义方式

        class Test{
            private instance_variable = "123"
        }
        
      • Python3 定义方式

        class Test: 
            def __init__(self):
                self.__instance_variable = "123"
        
  • Python类的方法有普通函数、类函数、静态函数之分

    1. 方法上不写任何注解(普通函数):这种修饰方式类比于Java中的成员函数的方式,在调用这种函数时会隐式地传递一个指向自身的指针self,通过这个指针可以调用示例变量,类似于Java中使用的this变量

      class Test: 
          
          def __init__(self): 
              self.__instance_variable = "123"
              
          def test(self): 
              print(self.__instance_variable)
      
      if __name__ == "__main__": 
          t = Test()
          t.test()
          # 此种方式调用实例变量将会报错,因为该实例变量是私有变量,不支持外部调用
          # print(t.__instance_variable)
      
    2. 方法上使用@classmethod注解(类函数):类函数无法访问实例变量,只能访问类变量,这种修饰方式类比于Java中的静态函数,但是又有所不同,调用这种函数的时候会隐式地传递一个类指针cls,通过这个指针可以调用类变量,而Java在成员函数中引用静态变量时是不需要显示指定类来调用静态变量的

      class Test:
      
          class_variable = "123"
      
          def __init__(self):
              self.__instance_variable = "234"
      
          @classmethod
          def test(cls):
              print(cls.class_variable)
              # 此种方式调用实例变量将会报错,因为类函数不能调用实例变量
              # print(cls.__instance_variable)
              
      if __name__ == "__main__": 
          # 可以实例调用类函数,也可以类直接调用类函数
          t = Test()
          t.test()
          Test.test()
      
    3. 方法上使用@staticmethod注解(静态函数):Python3中的静态函数与Java中的静态函数定义不同,其静态函数绑定在类上,但是不依赖于类变量或其实例变量,因此也不会隐式传递任何指针

      class Test: 
          
          class_variable = "123"
          
          def __init__(self): 
              self.__instance_variable = "234"
              
          @staticmethod
          def test(x):  # 注:此处已经不再需要设置默认接收指针的变量self或cls,x为调用函数时手动传递的变量 
              print(x)
              # 类变量必须通过类来引用,实例变量必须通过实例来引用,下面都是错误的用法,无法直接访问类变量或实例变量
              # print(class_variable)
              # print(__instance_variable)
              
      if __name__ == "__main__":
          # 可以实例调用类函数,也可以类直接调用类函数
          t = Test()
          t.test("233")
          Test.test("233")
      
posted @ 2019-06-27 23:12  soundofcolors  阅读(380)  评论(0编辑  收藏  举报