面向对象的各种方法

静态方法 - @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

知识点

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

Python - 面向对象(二)类方法、静态方法的更多相关文章

  1. python面向对象 : 属性, 类方法, 静态方法

    一. 属性 属性: 将方法伪装成一个属性,代码上没有什么提升,只是更合理. property应用 : 类似于bmi这种,area,周长.... 需要用到计算的.   # 求BMI体质数:BMI = 体 ...

  2. python 面向对象:类方法&静态方法

    一.类方法 1.1 概念和语法说明 类方法就是针对类对象定义的方法.在类方法内部可以直接访问类属性或者调用其他的类方法 语法如下: @classmethod def 类方法名(cls): pass 说 ...

  3. python面向对象(二)——类成员

    Python面向对象    类成员 1.字段         普通字段    属于对象         静态字段    属于类   2.方法 普通方法   触发者是对象    括号里至少一个参数 se ...

  4. 【学习笔记】--- 老男孩学Python,day18 面向对象------ 属性,类方法,静态方法

    属性 属性: 将方法伪装成一个属性,代码上没有什么提升,只是更合理. 应用场景: 类中 要用名词时候可以用@property  比如,求面积,周长,平方,体脂 等运算时候 例如:   bmi是名词,最 ...

  5. [b0016] python 归纳 (二)_静态方法和类方法

    # -*- coding: UTF-8 -*- """ 测试 类的静态方法,类方法 @staticmethod @classmethod 总结: 1. self 指向类对 ...

  6. python面向对象二

    1.1类的静态属性,类方法,类的静态方法 1.1.1静态属性(@property) 在类中: python内置的@property装饰器就是负责把一个方法(函数)变成属性来调用. class Stud ...

  7. Python的实例方法,类方法,静态方法之间的区别及调用关系

    如果只看这个图,很多人可能会看的一头雾水,特别是学过完全面向对象语言的同学, Python 是双面向的,既可以面向函数编程,也可以面向对象编程,所谓面向函数就是单独一个. py 文件,里面没有类,全是 ...

  8. python面向对象:类方法

    类的方法包括以下几种: 构造方法 :__init__(self,) 析构方法 :__del__(self) 类方法@classmethod.实例方法.静态方法@staticmethod 一.构造方法 ...

  9. python 面向对象二 类和实例

    一.类和实例 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法, ...

  10. python 面向对象(二)成员

    ##################################总结########################### 类的成员: 变量: 实例变量      对象.属性=xxx 类变量    ...

随机推荐

  1. Servlet+JSP 对外访问路径配置

    servlet类似 servlet配置为: <servlet>    <servlet-name>Demo01_OutWrite</servlet-name>    ...

  2. Linux下运行命令出现is not in the sudoers file的问题

    原因: 用户没有加入到sudo的配置文件里. 解决方法:  1.切换到root用户,运行visudo命令:  2.找到root ALL=(ALL) ALL,在下面添加一行 xxx  ALL=(ALL) ...

  3. JavaScript 语言精粹笔记3

    方法 毒瘤 糟粕 记录一下阅读蝴蝶书的笔记,本篇为书中最后一部分:方法.代码风格.优美的特性.毒瘤.糟粕等. 方法 这一章主要介绍了一些方法集.这里写几个我不太熟悉的方法和要点吧. array.joi ...

  4. 基于webhook方案的Git自动部署方案

    之前已经用Git实现了自己博客的提交自动部署,并自动提交到GitHub和coding以备不时之需.平时项目代码都托管在Coding或者GitHub上,也已经用上了coding提供的webhook功能, ...

  5. iPhone7产业链不为人知的辛酸

    ​苹果金秋新品发布会是科技界的"春晚",年复一年地重复,难免会让人产生审美疲劳,但每逢中国教师节前后,全球的科技人士和媒体还是会不约而同地走到一起,等待苹果团队为之奉献出好的产品和 ...

  6. LeetCode~报数(简单)

    报数(简单) 题目描述: 报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数.其前五项如下: 1 11 21 1211 111221 1 被读作 "one 1" ( ...

  7. 记 MySQL优化 20条

    1. 为查询缓存优化你的查询 大多数的MySQL服务器都开启了查询缓存.这是提高性最有效的方法之一,而且这是被MySQL的数据库引擎处理的.当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一 ...

  8. 30s源码刨析系列之函数篇

    前言 由浅入深.逐个击破 30SecondsOfCode 中函数系列所有源码片段,带你领略源码之美. 本系列是对名库 30SecondsOfCode 的深入刨析. 本篇是其中的函数篇,可以在极短的时间 ...

  9. 《SDN期末作业——实现负载均衡》

    队名:取个队名真难 一.网络拓扑(场景二) 二.负载均衡程序 1.建立拓扑的代码 拓扑 2.下发组表流表的代码 下发组表流表 三.演示视频 1.目的 服务器h2,h3,h4上各自有不同的服务,h1是客 ...

  10. Requests功能整理

    import requests # GET r = requests.get('https://api.github.com/events') # POSTr = requests.post('htt ...