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
知识点
类对象调用实例方法时,需要传递类对象
Python - 面向对象(二)类方法、静态方法的更多相关文章
- python面向对象 : 属性, 类方法, 静态方法
一. 属性 属性: 将方法伪装成一个属性,代码上没有什么提升,只是更合理. property应用 : 类似于bmi这种,area,周长.... 需要用到计算的. # 求BMI体质数:BMI = 体 ...
- python 面向对象:类方法&静态方法
一.类方法 1.1 概念和语法说明 类方法就是针对类对象定义的方法.在类方法内部可以直接访问类属性或者调用其他的类方法 语法如下: @classmethod def 类方法名(cls): pass 说 ...
- python面向对象(二)——类成员
Python面向对象 类成员 1.字段 普通字段 属于对象 静态字段 属于类 2.方法 普通方法 触发者是对象 括号里至少一个参数 se ...
- 【学习笔记】--- 老男孩学Python,day18 面向对象------ 属性,类方法,静态方法
属性 属性: 将方法伪装成一个属性,代码上没有什么提升,只是更合理. 应用场景: 类中 要用名词时候可以用@property 比如,求面积,周长,平方,体脂 等运算时候 例如: bmi是名词,最 ...
- [b0016] python 归纳 (二)_静态方法和类方法
# -*- coding: UTF-8 -*- """ 测试 类的静态方法,类方法 @staticmethod @classmethod 总结: 1. self 指向类对 ...
- python面向对象二
1.1类的静态属性,类方法,类的静态方法 1.1.1静态属性(@property) 在类中: python内置的@property装饰器就是负责把一个方法(函数)变成属性来调用. class Stud ...
- Python的实例方法,类方法,静态方法之间的区别及调用关系
如果只看这个图,很多人可能会看的一头雾水,特别是学过完全面向对象语言的同学, Python 是双面向的,既可以面向函数编程,也可以面向对象编程,所谓面向函数就是单独一个. py 文件,里面没有类,全是 ...
- python面向对象:类方法
类的方法包括以下几种: 构造方法 :__init__(self,) 析构方法 :__del__(self) 类方法@classmethod.实例方法.静态方法@staticmethod 一.构造方法 ...
- python 面向对象二 类和实例
一.类和实例 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法, ...
- python 面向对象(二)成员
##################################总结########################### 类的成员: 变量: 实例变量 对象.属性=xxx 类变量 ...
随机推荐
- 转:zabbix 2.0.6监控cisco交换机 2950 2960s 3560G
转自: http://blog.chinaunix.net/uid-24250828-id-3806551.html 想在zabbix 上监控交换机端口的流量,找了两天的模板,包括官方的和网友写的.在 ...
- 吴裕雄--天生自然 R语言开发学习:处理缺失数据的高级方法(续一)
#-----------------------------------# # R in Action (2nd ed): Chapter 18 # # Advanced methods for mi ...
- Java JDBC调用inout类型参数的存储过程
存储过程参数类型:in.out.inout,in:输入类型,out:输出类型,inout:既可输入,也可以输出. 一.JDBC调用inout类型参数的存储过程,并且获得返回值 Class.forNam ...
- ServletContext+ServletConfig内容
ServletConfig { ① //读取web.xml配置信息 ServletConfig config = this.getServletConfig(); //读取类名称 config.get ...
- c++入门资源
http://www.cnblogs.com/jackyyang7/articles/2479482.htmlvs2010编译器的使用 https://www.cnblogs.com/me115/ar ...
- JavaScript值类型和引用类型有哪些
JavaScript值类型和引用类型有哪些 (1)值类型:数值.布尔值.null.undefined. (2)引用类型:对象.数组.函数.
- BTCU(高校区块链联盟)-联盟链第6讲作业
// payment project main.go package main import ( "fmt" "strconv" "github.co ...
- 《自动化平台测试开发-Python测试开发实战》第2次印刷
书籍货源比较紧张.紧张啊,如此短的时间,已经第2次印刷.第2次印刷. 第2次印刷. 同时该书已确认与台湾出版社合作翻译成繁体版,甚至有可能与国外出版社合作翻译成英文版. 2018年7月 第1次印刷 2 ...
- Python Mock 的入门
Mock是什么 Mock这个词在英语中有模拟的这个意思,因此我们可以猜测出这个库的主要功能是模拟一些东西.准确的说,Mock是Python中一个用于支持单元测试的库,它的主要功能是使用mock对象替代 ...
- JNI 问题 wrong ELF class
使用JNI发现一个问题, wrong ELF class: ELFCLASS64)主要是机器是64位的OS,默认编译的.so是64位 而java设置的默认是32位 JDK, 所以会出现这个问题.那么就 ...