在类中定义的方法默认都是实例方法,前面几篇文章已经大量使用到实例方法
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
cls.实例方法(cls)
可以,但不建议
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 变量可以吗
肯定不行,报错
类对象.类属性
代码栗子直接看上面一个就是啦!
@staticmethod
类里面封装的方法
就可以考虑将这个方法封装成一个静态方法
class PoloBlog:
# 静态方法
@staticmethod
def info(name, age):
print(name, age)
# 通过类对象调用
PoloBlog.info("小菠萝111", 24)
blog = PoloBlog()
# 通过实例对象调用
blog.info("小菠萝222", 14)
# 输出结果
小菠萝111 24
小菠萝222 14
也可以参考这篇文章
待我实战后再来完善此章节