- 实例方法:
- 第一个参数代表 实例本身,强制必须,惯例cls
- 操作/修改的是 实例属性
- 仅实例能调用
- 类方法:
- 第一个参数代表 类本身,强制必须,惯例cls
- 操作/修改的是 类属性(即使是实例调用)
- 类、实例均能调用
- 静态方法:
- 正常参数
- 无法操作任何属性
- 类、实例均能调用
- 类静态函数:
- 正常参数
- 无法操作任何属性
- 类、实例均能调用
~~~
class Cls:
def instance_method(self, *args, **kwargs):
pass
@classmethod
def class_method(cls, *args, **kwargs):
pass
@staticmethod
def static_method(*args, **kwargs):
pass
def static_func(*args, **kwargs):
pass
# 当然也可以不使用装饰器@语法糖创建 类方法、静态方法
def a(cls, *args, **kwargs):
pass
a = classmethod(a)
def b(*args, **kwargs):
pass
b = staticmethod(b)
ins = Cls()
# 调用 实例方法
ins.instance_method()
# 调用 类方法
ins.class_method()
Cls.class_method()
ins.a()
Cls.a()
# 调用 静态方法
ins.static_method()
Cls.static_method()
ins.b()
Cls.b()
# 调用 静态函数
Cls.static_func()
ins.static_func()
~~~
静态方法 vs 静态函数
-------------
两者其实就是所属对象命名空间下的普通函数,不能操作类的任何属性。通常用来定义一些和类主题相关的函数。
- 类外:均能被 类/实例 调用
- 类内:
- 初始化类属性时:可以调用静态函数,不能调用静态方法
- 类/实例方法中:均能通过 self 或 cls 调用
- 静态方法/函数中:均不能调用
产生的疑问:`@staticmethod`有什么用?
能用静态方法的地方都可以用静态函数代替,相反却不成立(初始化类属性时)。
~~~
class Cls:
def instance_method(self, *args, **kwargs):
self.static_method()
self.static_func()
pass
@classmethod
def class_method(cls, *args, **kwargs):
cls.static_method()
cls.static_func()
pass
@staticmethod
def static_method(*args, **kwargs):
#static_func() # NameError: name 'static_func' is not defined
pass
def static_func(*args, **kwargs):
#static_method() # NameError: name 'static_method' is not defined
#static_func1() # NameError: name 'static_func1' is not defined
pass
def static_func1(*args, **kwargs):
pass
# classmethod staticmethod 本质就是两个预定义的静态函数
def a(cls, *args, **kwargs):
pass
a = classmethod(a)
def b(*args, **kwargs):
pass
b = staticmethod(b)
#c = static_method() # TypeError: 'staticmethod' object is not callable
d = static_func()
ins = Cls()
# 调用 实例方法
ins.instance_method()
# 调用 类方法
ins.class_method()
Cls.class_method()
ins.a()
Cls.a()
# 调用 静态方法
ins.static_method()
Cls.static_method()
ins.b()
Cls.b()
# 调用 静态函数
Cls.static_func()
ins.static_func()
~~~
观测属性变化
------
**以下内容可以忽略不看,都是废话**
添加观测属性变化的代码:
~~~
class Cls:
p1, p2 = 'a', 'b'
def instance_method(self, *args, **kwargs):
self.p1 = self.p1.upper()
@classmethod
def class_method(cls, *args, **kwargs):
cls.p2 = cls.p2.upper()
@staticmethod
def static_method(*args, **kwargs):
pass
def class_static_func(*args, **kwargs):
pass
# 当然也可以不使用装饰器@语法糖创建 类方法、静态方法
def a(cls, *args, **kwargs):
cls.p2 = cls.p2.upper()
a = classmethod(a)
def b(*args, **kwargs):
pass
b = staticmethod(b)
ins = Cls()
ins.p1, ins.p2 = 'aa', 'bb'
print(Cls.p1, ins.p1, Cls.p2, ins.p2) # a aa b bb -- 均小写
# 实例方法
ins.instance_method()
print(Cls.p1, ins.p1) # a AA -- 修改 实例属性
# 类方法
ins.class_method()
Cls.class_method()
ins.a()
Cls.a()
print(Cls.p2, ins.p2) # B bb -- 修改 类属性
# 静态方法
ins.static_method()
Cls.static_method()
ins.b()
Cls.b()
# 类静态方法
Cls.class_static_func()
~~~
- 前言
- Python编程规范
- 编码
- 代码
- 缩进、行宽、引号、空行
- 空格
- 换行
- import
- 注释
- 代码注释
- 文档注释(Docstring)
- 命名规范
- 数据结构
- 变量
- 变量作用域
- 命名空间
- 作用域
- python作用域
- 对象
- 序列
- 可迭代对象
- 迭代器
- 生成器
- 可迭代对象 & 迭代器 & 生成器
- 整数池 & 字符串intern
- 数据类型
- 数字
- int
- float
- NaN
- 四舍五入 & 取整
- 列表
- 元组
- 字典
- 集合
- 字符串
- 字符集&字符编码
- 字符串&字节串
- 字符串函数
- 字符串格式化
- str.format
- Formatted string literals
- format函数
- string.Formatter类
- %
- Format String Syntax
- Format Specification Mini-Language
- fill
- align
- sign
- #
- 0
- width
- grouping_option
- .precision
- type
- locale
- Python3 locale 模块
- 语句
- 运算符
- if/else
- for...in
- while
- break/continue
- 函数
- 函数
- 函数参数
- 递归函数
- 匿名函数
- 高阶函数
- map
- reduce
- filter
- sorted
- 返回函数
- 闭包
- 装饰器
- 函数装饰器
- 带参数的装饰器
- 类装饰器
- 带参数的类装饰器
- 偏函数
- 面向对象
- 类 & 实例
- 属性
- 方法
- 访问限制
- 继承
- 新式类 & 经典类
- MRO
- MixIn
- 模块
- 特殊变量
- 编写模块
- 引入 & 重载
- 搜索模块
- 第三方模块
- 常见模块
- 标准库
- os
- sys
- datetime
- re
- urllib
- time/datetime
- threading
- multiprocessing
- builtins
- help
- range
- enumerate
- 异同
- str() repr() ascii()
- exit()、sys.exit()、os._exit()
- 数据库
- mysql
- 错误、调试、测试
- 异常
- 异常处理
- 自定义异常
- 抛出异常
- 调试
- logging
- pdb
- 线程&&进程
- 线程
- 杂
- python 脚本传参
- python无关
- redis
- mongo
- linux
- mysql简略