zoukankan      html  css  js  c++  java
  • Python 面向对象(二)类方法、静态方法

    面向对象的各种方法

    静态方法 - @staticmethod 

    class Person():
        name = "cool guy"
    
        @staticmethod
        def static(self):
            print("staticmethod", self.name)
    
    
    if __name__ == "__main__":
        p = Person()
        p.static()

    执行结果

        p.static()
    TypeError: static() missing 1 required positional argument: 'self'

    为什么会报错?

    静态方法不能访问实例属性、类属性、实例方法、类方法

    静态方法的特别之处

    • 它跟类与对象无关
    • 跟在模块中直接定义普通函数没有什么区别,只是把“静态方法”放到了类里面,所以只能设置形参
    • 只能通过 类名.静态方法 来调用

    正确调用写法

    class Person():
        name = "cool guy"
    
        @staticmethod
        def static(name):
            print("staticmethod", name)
    
    
    if __name__ == "__main__":
        p = Person()
        Person.static(p.name)

    执行结果

    staticmethod cool guy

    类方法 - @classmethod

    class person:
        name = "cool man"
    
        @classmethod
        def class_m(cls):
            print("--第一个类方法--", id(cls))
            print("--第一个类方法--", cls.name)
            cls.self_m(cls)
            cls.class_m2()
    
        def self_m(self):
            print("--实例方法--", id(self))
            print("--实例方法--", self.name)
    
        @classmethod
        def class_m2(cls):
            print("--第二个类方法--", id(cls))
    
    
    p = person()
    p.name = "bad boy"  # 绑定实例属性
    p.class_m()
    person.class_m()

    执行结果

    --第一个类方法-- 2381398112712
    --第一个类方法-- cool man
    --实例方法-- 2381398112712
    --实例方法-- cool man
    --第二个类方法-- 2381398112712
    --第一个类方法-- 2381398112712
    --第一个类方法-- cool man
    --实例方法-- 2381398112712
    --实例方法-- cool man
    --第二个类方法-- 2381398112712

    知识点

    • 类方法内部可以直接访问类属性、类方法、实例方法
    • cls 可以理解成类对象的引用,哪一个类对象调用的方法, cls 就是哪个一个类的引用, 类对象.类方法 ;和实例方法中的 self 很像, 实例对象.实例方法 
    • 调用其他类方法时,不用传递cls参数;但调用其他实例方法时,需要传递cls参数
    • 在类方法内部调用的实例方法,接收的是一个类对象而不是实例对象,当实例对象绑定实例属性时,在实例方法中打印的仍然是类属性;表明类方法无法访问实例属性
    • 一个类只有一个类对象,即使通过实例对象调用类方法,传递的仍然是类对象的引用,所有类方法都被同一个类对象调用

    思考题

    如果方法内部 即需要访问 实例属性,又需要访问 类属性,应该定义成什么方法?

    答案:实例方法,因为可以通过  类对象.类属性 来访问,但在类方法中无法访问实例属性

    class Person:
        name = "cool man"
    
        def self_m(self):
            Person.name = "yep"
            print(self.name)
    
    
    p = Person()
    p.name = "bad boy"  # 绑定实例属性
    p.self_m()
    Person.self_m(Person)

    执行结果

    bad boy
    yep

    知识点

    类对象调用实例方法时,需要传递类对象

  • 相关阅读:
    Android View部分消失效果实现
    Android TV Overscan
    一招搞定短信验证码服务不稳定
    揭秘:网上抽奖系统如何防止刷奖
    SVN迁移到GIT
    Android之高效率截图
    Android TV 开发(5)
    Android 标题栏(2)
    Android 标题栏(1)
    一步步教你学会browserify
  • 原文地址:https://www.cnblogs.com/poloyy/p/12533998.html
Copyright © 2011-2022 走看看