zoukankan      html  css  js  c++  java
  • Python Class 的实例方法/类方法/静态方法

    实例方法、类方法、静态方法

    class MyClass(object):
    
        class_name = "MyClass"  # 类属性, 三种方法都能调用
    
        def __init__(self):
            self.instance_name = "instance_name"  # 实例属性, 只能被实例方法调用
            self.class_name = "instance_class_name"
    
        def get_class_name_instancemethod(self):  # 实例方法, 只能通过实例调用
            # 实例方法可以访问类属性、实例属性
            return MyClass.class_name
    
        @classmethod
        def get_class_name_classmethod(cls):  # 类方法, 可通过类名.方法名直接调用
            # 类方法可以访问类属性,不能访问实例属性
            return cls.class_name
    
        @staticmethod
        def get_class_name_staticmethod():  # 静态方法, 可通过类名.方法名直接调用
            # 静态方法可以访问类属性,不能访问实例属性
            return MyClass.class_name
    
        def instance_visit_class_attribute(self):
            # 实例属性与类属性重名时,self.class_name优先访问实例属性
            print "实例属性与类属性重名时,优先访问实例属性"
            print "self.class_name:", self.class_name
            print "MyClass.name:", MyClass.class_name
    
    if __name__ == "__main__":
        MyClass.class_name = "MyClassNew"
        intance_class = MyClass()
        print "instance method:", intance_class.get_class_name_instancemethod()
        print "class method:", MyClass.get_class_name_classmethod()
        print "static method:", MyClass.get_class_name_staticmethod()
        intance_class.instance_visit_class_attribute()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    执行效果

    instance method: MyClassNew
    class method: MyClassNew
    static method: MyClassNew
    实例属性与类属性重名时,优先访问实例属性
    self.class_name: instance_class_name
    MyClass.name: MyClassNew
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2. 区别

    1. 实例方法

      属于实例的方法 
      只能通过实例名.方法名调用。 
      其可以访问类属性、实例属性,类方法、实例方法、静态方法。

    2. 类方法

      属于类类的方法 
      可以通过实例名.方法名,也可以类名.方法名 
      其不能访问实例属性和实例方法

    3. 静态方法

      和类方法很相似,不同的时候定义时要定义(cls)参数 
      可以通过实例名.方法名,也可以类名.方法名 
      其不能访问实例属性和实例方法

    3. 静态方法与类方法

    这两者非常像,都是源于C++或JAVA中static的思想。不过我觉得,python的静态方法是从c++和java进化时的一个不完全产物。尽量使用类方法,不使用静态方法。

    python的实例属性、类属性对应c++或java中的非静态属性和静态属性 
    python的实例方法、类方法对应c++或java中的非静态方法和静态方法

    下面是一个类方法比静态方法牛逼的地方

    class Color(object):
        _color = (0, 0, 0);
    
        @classmethod
        def value(cls):
            if cls.__name__== 'Red':
                cls._color  = (255, 0, 0)
    
            elif cls.__name__ == 'Green':
                cls._color = (0, 255, 0)
    
            return cls._color
    
        class Red(Color):
            pass
    
        class Green(Color):
            pass
    
        class UnknownColor(Color):
            pass
    
    red = Red()
    green = Green()
    xcolor = UnknownColor()
    
    print 'red = ', red.value()
    print 'green = ', green.value()
    print 'xcolor =', xcolor.value()
  • 相关阅读:
    疫情在家没事做推荐个学习的目录:怎么从一名码农成为架构师的必看知识点:目录大全(不定期更新)
    教你使用 Swoole-Tracker 秒级定位 PHP 卡死问题
    怎样深入学习php,成为php高手!?
    PHP实现简单RPC
    PHP工作岗位要求
    关于PHP在企业级开发领域的访谈
    未知及待办清单
    siege报告学习
    session&token based auth登录方式描述
    学习JWT
  • 原文地址:https://www.cnblogs.com/ExMan/p/9408455.html
Copyright © 2011-2022 走看看