前言
只是叫法不一样
实例属性 = 实例变量
类属性 = 类变量
个人认为叫属性更恰当
类属性和实例属性区别
有一个表格,四个常见的明星
姓名 |
年龄 |
---|---|
周润发 |
58 |
成龙 |
55 |
刘德华 |
53 |
周星驰 |
54 |
总结一下
使用面向对象编程思想来总结的话
self.变量名
变量名=变量值
类属性在类中的定义
class 类名:
类属性1 = 值
类属性2 = 值
def func(self):
...
类属性、类方法注意点
ClassName.classProperty
类属性的栗子
# 类属性
class PoloBlog:
# 这就是在所有方法之外 下面定义了 2 个类变量
name = "小菠萝测试笔记"
blog = "https://www.cnblogs.com/poloyy/"
# 通过类名调用类属性
print(PoloBlog.name)
print(PoloBlog.blog)
# 输出结果
小菠萝测试笔记
https://www.cnblogs.com/poloyy/
通过 Pycharm 的代码联想,可以看到 blog、name、__doc__ 三个类属性
类属性的调用方式
有两种
调用类属性的栗子
# 调用类属性的两种方式
class PoloBlog:
# 这就是在所有方法之外 下面定义了 2 个类变量
name = "小菠萝测试笔记"
blog = "https://www.cnblogs.com/poloyy/"
# 通过类名直接调用
print(PoloBlog.name)
print(PoloBlog.blog)
# 修改类属性
PoloBlog.name = "blogyuan"
PoloBlog.blog = "https://www.cnblogs.com/"
# 通过实例对象调用修改后的类属性
poloBlog = PoloBlog()
print(poloBlog.name)
print(poloBlog.blog)
# 输出结果
小菠萝测试笔记
https://www.cnblogs.com/poloyy/
blogyuan
https://www.cnblogs.com/
通过类名修改类属性的值,会影响所有的实例化对象
实例对象修改类属性
# 修改类属性
poloBlog.name = "小菠萝回来了"
# 再看看类对象调用修改后的类属性
print(PoloBlog.name)
print(poloBlog.name)
# 输出结果
blogyuan
小菠萝回来了
类名.name
实例对象.name
动态添加类属性
PoloBlog.age = 24
print(PoloBlog.age)
print(poloBlog.age)
# 输出结果
24
24
类名.new_property_name
实例属性的栗子
class PoloBlog:
def __init__(self):
# 在方法内部,通过 self.name 的方式定义的变量就是实例变量
self.name = "小菠萝测试笔记"
self.add = "https://www.cnblogs.com/poloyy/"
# 下面定义了一个 say 实例方法
def say(self):
self.age = 13
# 实例化对象
blog = PoloBlog()
blog.say()
print(blog.name, blog.add, blog.age)
# 输出结果
小菠萝测试笔记 https://www.cnblogs.com/poloyy/ 13
修改实例属性的栗子
blog.name = "小菠萝"
blog.add = "xiaopolo.com"
blog.age = 24
print(blog.name, blog.add, blog.age)
# 输出结果
小菠萝 xiaopolo.com 24
动态添加实例属性
blog.phone = 13501489999
print(blog.phone)
# 输出结果
13501489999
上面也有说到,通过 实例对象.属性名 的方式并不会给类变量赋值,而是定义一个新的实例变量
综合栗子
# 综合栗子
class PoloBlogObjectTest:
# 类变量
sum = 0
# 初始化方法
def __init__(self, name, age):
# 实例变量
self.name = name
self.age = age
# 类变量
PoloBlogObjectTest.sum += 1
# 实例方法
def printNameAge(self):
print(self.name, self.age)
poloTest1 = PoloBlogObjectTest("小菠萝一号", 24)
poloTest2 = PoloBlogObjectTest("小菠萝二号", 14)
print(PoloBlogObjectTest.sum)
# 调用实例方法
poloTest1.printNameAge()
poloTest2.printNameAge()
# 输出结果
2
小菠萝一号 24
小菠萝二号 14
实例属性、类属性同名栗子
class Person:
# 只有一个类变量
name = "cool guy"
# 实例化一个对象
p = Person()
# 打印实例属性 name,因为实例对象并没有name属性,所以会继续查找class的name属性
print(p.name)
# 打印类属性 name
print(Person.name)
# 给实例绑定 name、age 属性
p.name = "bad guy"
p.age = 12
# 打印 name、age 属性
print(p.age)
# 由于实例属性优先级比类属性高,因此,它会屏蔽掉类的 name 属性
print(p.name)
# 仍然打印类的 name 属性
print(Person.name)
# 输出结果
cool guy
cool guy
12
bad guy
cool guy
实例对象属性引用的查找过程
最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:
这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!