zoukankan      html  css  js  c++  java
  • 类变量、绑定方法、静态方法和类方法

    类变量

    面向对象的结构

    • 类成员
      • 类变量(静态字段/属性)
      • 方法
        • 绑定方法:常规的形式(只能通过对象调用)
        • 静态方法(推荐类调用)
        • 类方法(推荐类调用)
        • 属性
          对象可以调用所用的方法
    • 实例(对象)
      • 实例变量(字段/属性)
    class Foo:
        city = "北京" #成员city就叫类变量
        def __init__(self,name):
            self.name = name
    
        def func(self):
            pass
    
    obj1 = Foo("杨子莲")
    obj2 = Foo("女神")
    print(obj1.city)
    print(Foo.city)#比较正式的写法
    print(obj.city)
    
    '''
    输出结果为:
    北京
    北京
    北京
    '''
    
    • 定义时:写在类的下一级和方法同级

    • 访问:

      • 类.类变量名称
        对象.类变量名称
        

    示例一

    class Base:
        x = 1
    obj = Base()
    print(obj.x)
    '''
    类里面没有方法只有一个类变量,所以输出的结果为1
    '''
    obj.y = 123 #在对象中添加一个y = 123的变量
    obj.x = 123 #在对象中添加一个x-123的变量,并不能改变类中的x = 1的
    Base.x = 666 #改变了类中的x = 1的变量
    

    示例二

    #练习1
    class Base:
        x = 1
    
    class Foo(Base):
        pass
    
    print(Foo.x) #继承关系
    #结果为1
    
    #练习2
    class Base:
        x = 1
    class Foo(Base):
        pass
    Foo.x = 666 #只改变自己,并没有改变Base
    print(Base.x)
    print(Foo.x)
    '''
    结果为
    1
    666
    '''
    

    示例三

    class Parent:
       x = 1
    class Child(Parent):
       pass
    obj = Child()
    print(obj.x)
    obj.x = 2 #只改变了对象而未改变类,所以Child.x的结果依然为1
    print(Child.x)
    

    总结:

    • 找变量优先找自己 ,自己没有找 类 或 基类
    • 修改时或赋值时只能在自己的内存中进行赋值,不能修改父级或其他

    静态方法

    • 定义:

      • @staticmethod装饰器
      • 参数无限制
    • 执行:

      • 类.静态方法
      class Foo:
          def __init__(self):
              self.name = 123
      
          def func(self,a,b):
              print(self.name,a,b)
      
          def func1(a,b):
              print("yang")
      
          @staticmethod
          def f1(a,b): #静态方法:不用创建对象,直接通过类进行调用
              print(123)
      
      Foo.func1("1","zi")
      
      '''
      思考:
      我认为通过静态方法调用的函数和普通定义一个函数的区别不大。就像func1与f1的差别并不是很大一样。
      '''
      

    类方法

    class Foo:
        @staticmethod
        def f1(a,b): #静态方法:不用创建对象,直接通过类进行调用
            print(123)
    
        @classmethod #类方法
        def f2(cls,a,b):#cls为固定参数,返回的为当前类
            print("cls是当前类",cls)
            print(a,b)
            '''
            结果为:
            cls是当前类 <class '__main__.Foo'>
    		1 zi
            '''
    
    Foo.f2("1","zi")
    

    类方法

    • 定义:
      • @classmethod装饰器
      • 至少有cls参数,当前类
    • 执行:
      • 类.类方法
      • 对象.类方法(不推荐)

    问题 @classmethod和staticmethod的区别

    • 一个是类方法一个是静态方法。
    • 定义:
      • 类方法:用@classmethod做装饰器且至少有一个cls参数
      • 静态方法:用staticmethod做装饰器且参数无限制
    • 调用:
      • 类.方法直接调用
      • 对象.方法也可以调用
  • 相关阅读:
    html5游戏开发1Aptana 3 eclipse 插件安装
    HTML5 game Development Summary
    前端开发必备的工具
    前端优化方案
    JavaScript 事件冒泡简介及应用(转)
    标准W3C盒子模型和IE盒子模型CSS布局经典盒子模型(转)
    理解.NET中的异常(二)
    异常处理准则
    C#通讯编程
    C#读写文件总结
  • 原文地址:https://www.cnblogs.com/yangzilaing/p/13738416.html
Copyright © 2011-2022 走看看