什么科技网站建设,wordpress传上去,绍兴以往网站招工做,导航去浙江省肿瘤医院实例方法
在类中定义的方法默认都是实例方法#xff0c;前面几篇文章已经大量使用到实例方法
实例方法栗子
class PoloBlog:def __init__(self, name, age):print(自动调用构造方法)self.name nameself.age agedef test(self):print(一个实例方法…实例方法
在类中定义的方法默认都是实例方法前面几篇文章已经大量使用到实例方法
实例方法栗子
class PoloBlog:def __init__(self, name, age):print(自动调用构造方法)self.name nameself.age agedef test(self):print(一个实例方法需要通过对象调用)print(my name is :, self.name, and my age is :, self.age)blog PoloBlog(小菠萝, 24)
blog.test()# 输出结果
自动调用构造方法
一个实例方法需要通过对象调用
my name is : 小菠萝 and my age is : 24 最少也要包含一个 self 参数用于绑定调用此方法的实例对象Python 会自动完成绑定实例方法通常会用实例对象直接调用
通过类名调用实例方法
Python 也支持通过类名调用实例方法但需要手动给 self 参数传实例对象
blog PoloBlog(小菠萝, 24)PoloBlog.test(blog)# 输出结果
自动调用构造方法
一个实例方法需要通过对象调用
my name is : 小菠萝 and my age is : 24 假设不传实例对象pycharm 会有warning 类方法
类方法和实例方法很相似又很不相似
相似点
也至少要包含一个参数不过通常命名为 cls在调用类方法时无需显式为 cls 参数传参但传递的并不是实例对象而是类对象本身
不同点
最大的不同在于需要使用 classmethod 装饰器才能称为类方法
实际栗子
class PoloBlog:# 类属性sum 0# 类方法, 添加装饰器classmethoddef class_func(cls):print(class_func cls 对象的 id , id(cls))cls.sum 1print(类属性 sum , cls.sum)classmethoddef class_func_twi(cls):print(class_func_twi cls 对象的 id , id(cls))cls.sum 1print(类属性 sum , cls.sum)PoloBlog.class_func()
PoloBlog.class_func_twi()# 输出结果
class_func cls 对象的 id 140583542774880
类属性 sum 1
class_func_twi cls 对象的 id 140583542774880
类属性 sum 2 cls 代表的是同一个对象类对象
类方法可以调用实例方法吗
可以但有局限性
class PoloBlog:# 类属性sum 0def __init__(self, sum):self.sum sum# 实例方法def test(self):print(self id is ,id(self))print(self 对象的 sum 属性值为, self.sum)# 类方法, 添加装饰器classmethoddef class_func(cls):print(cls id is , id(cls))print(类属性 sum , cls.sum)# 调用实例方法cls.test(cls)PoloBlog.class_func()# 输出结果
cls id is 140500501817184
类属性 sum 0
self id is 140500501817184
self 对象的 sum 属性值为 0 类方法调用实例方法的方式 通过 cls 调用且还要传递 cls 为参数
cls.实例方法(cls)
从 id 相同即可看出实例方法接收的仍然是一个类对象
实例对象可以调用类方法吗
可以但不建议
blog PoloBlog(2)
blog.class_func()# 输出结果
cls id is 140500501817184
类属性 sum 0
self id is 140500501817184
self 对象的 sum 属性值为 0 blog 是一个实例对象且初始化赋值了 sum 实例属性但最后实例方法打印的仍然是 sum 类属性表明类方法无法访问实例属性且 cls、self 参数的 id 和上面的栗子完全一样表明即使通过实例对象调用类方法传递的仍然是类对象的引用所有类方法都被同一个类对象调用一个类只有一个类对象
实例方法可以调用类属性吗
可以但不能通过实例对象调用只能通过类对象
class PoloBlog:# 类属性name 类啊类属性def __init__(self, name):self.name name# 实例方法def test(self):# 错误栗子# print(name)# 访问的仍然是实例属性print(self.name)# 通过类名访问print(PoloBlog.name)blog PoloBlog(小菠萝)
blog.test()# 输出结果
小菠萝
类啊类属性 假设直接调用 name 变量可以吗
肯定不行报错 扩展思考题
一个方法内部既需要访问实例属性又需要访问类属性应该定义为什么方法答案实例方法因为可以通过 来访问但在类方法中无法访问实例属性
类对象.类属性
代码栗子直接看上面一个就是啦
静态方法
和之前学过的函数一毛一样唯一区别是静态方法需要定义在类体中且需要添加 装饰器
staticmethod
静态方法没有 self、cls 参数也不需要至少传一个参数和普通函数一样Python 解释器不会对它包含的参数做任何类或对象的绑定所以静态方法无法调用任何类属性、类方法、实例属性、实例方法除非通过类名和实例对象
什么时候会用静态方法
类里面封装的方法
既不需要访问实例属性、实例方法也不需要访问类属性、类方法
就可以考虑将这个方法封装成一个静态方法
实际栗子
class PoloBlog:# 静态方法staticmethoddef info(name, age):print(name, age)# 通过类对象调用
PoloBlog.info(小菠萝111, 24)blog PoloBlog()
# 通过实例对象调用
blog.info(小菠萝222, 14)# 输出结果
小菠萝111 24
小菠萝222 14 关于实例方法、 classmethod 和 staticmethod 的实际应用场景
简单来说
实例方法方法内部需要访问实例属性、实例方法就定义为实例方法既需要访问实例属性、方法也需要访问类属性、方法那必须定义为实例方法类方法方法内部只需要访问类属性、类方法就定义为类方法静态方法方法内部既不需要访问实例属性、实例方法也不需要访问类属性、类方法就定义为静态方法