前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python - 面向对象(二)类方法、静态方法

Python - 面向对象(二)类方法、静态方法

作者头像
小菠萝测试笔记
发布2020-06-09 15:30:04
5340
发布2020-06-09 15:30:04
举报

面向对象的各种方法

静态方法 - @staticmethod

代码语言:javascript
复制
class Person():
    name = "cool guy"

    @staticmethod
    def static(self):
        print("staticmethod", self.name)


if __name__ == "__main__":
    p = Person()
    p.static()

执行结果

代码语言:javascript
复制
    p.static()
TypeError: static() missing 1 required positional argument: 'self'

为什么会报错?

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

静态方法的特别之处

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

正确调用写法

代码语言:javascript
复制
class Person():
    name = "cool guy"

    @staticmethod
    def static(name):
        print("staticmethod", name)


if __name__ == "__main__":
    p = Person()
    Person.static(p.name)

执行结果

代码语言:javascript
复制
staticmethod cool guy

类方法 - @classmethod

代码语言:javascript
复制
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()

执行结果

代码语言:javascript
复制
--第一个类方法-- 2381398112712
--第一个类方法-- cool man
--实例方法-- 2381398112712
--实例方法-- cool man
--第二个类方法-- 2381398112712
--第一个类方法-- 2381398112712
--第一个类方法-- cool man
--实例方法-- 2381398112712
--实例方法-- cool man
--第二个类方法-- 2381398112712

知识点

  • 类方法内部可以直接访问类属性、类方法、实例方法
  • 可以理解成类对象的引用,哪一个类对象调用的方法, cls 就是哪个一个类的引用, 类对象.类方法 ;和实例方法中的 self 很像, 实例对象.实例方法

cls

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

思考题

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

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

代码语言:javascript
复制
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)

执行结果

代码语言:javascript
复制
bad boy
yep

知识点

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-03-23 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 面向对象的各种方法
    • 静态方法 - @staticmethod
      • 执行结果
      • 为什么会报错?
      • 静态方法的特别之处
      • 正确调用写法
      • 执行结果
    • 类方法 - @classmethod
      • 执行结果
      • 知识点
    • 思考题
      • 执行结果
      • 知识点
相关产品与服务
日志服务
日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集、日志存储到日志检索,图表分析、监控告警、日志投递等多项服务,协助用户通过日志来解决业务运维、服务监控、日志审计等场景问题。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档