在类中定义的方法默认都是实例方法,前面几篇文章已经大量使用到实例方法
class PoloBlog: def __init__(self, name, age): print("自动调用构造方法") self.name = name self.age = age def 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
Python 也支持通过类名调用实例方法,但需要手动给 self 参数传实例对象
blog = PoloBlog("小菠萝", 24) PoloBlog.test(blog) # 输出结果 自动调用构造方法 一个实例方法,需要通过对象调用 my name is : 小菠萝 and my age is : 24
假设不传实例对象,pycharm 会有warning
类方法和实例方法很相似,又很不相似
最大的不同在于需要使用 @classmethod 装饰器才能称为类方法
class PoloBlog: # 类属性 sum = 0 # 类方法, 添加装饰器 @classmethod def class_func(cls): print("class_func cls 对象的 id ", id(cls)) cls.sum += 1 print("类属性 sum ", cls.sum) @classmethod def class_func_twi(cls): print("class_func_twi cls 对象的 id ", id(cls)) cls.sum += 1 print("类属性 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 = 0 def __init__(self, sum): self.sum = sum # 实例方法 def test(self): print("self id is ",id(self)) print("self 对象的 sum 属性值为:", self.sum) # 类方法, 添加装饰器 @classmethod def 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
可以,但不建议
blog = PoloBlog(2) blog.class_func() # 输出结果 cls id is 140500501817184 类属性 sum 0 self id is 140500501817184 self 对象的 sum 属性值为: 0
可以,但不能通过实例对象调用,只能通过类对象
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 变量可以吗
肯定不行,报错
代码栗子直接看上面一个就是啦!
class PoloBlog: # 静态方法 @staticmethod def info(name, age): print(name, age) # 通过类对象调用 PoloBlog.info("小菠萝111", 24) blog = PoloBlog() # 通过实例对象调用 blog.info("小菠萝222", 14) # 输出结果 小菠萝111 24 小菠萝222 14
可以参考这篇文章
待我实战后再来完善此章节
https://www.zhihu.com/question/20021164