在类中定义的方法默认都是实例方法,前面几篇文章已经大量使用到实例方法
实例方法栗子
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
简单来说
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!