面向对象的各种方法
静态方法 - @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
知识点
类对象调用实例方法时, 需要传递类对象
来源: http://www.bubuko.com/infodetail-3474554.html