https://www.cnblogs.com/poloyy/p/15178423.html
https://www.cnblogs.com/poloyy/p/15178456.html
只是叫法不一样
实例属性 = 实例变量
类属性 = 类变量
个人认为叫属性更恰当
有一个表格,四个常见的明星
姓名 | 年龄 |
---|---|
周润发 | 58 |
成龙 | 55 |
刘德华 | 53 |
周星驰 | 54 |
class 类名: 类属性1 = 值 类属性2 = 值 def func(self): ...
# 类属性 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 小菠萝回来了
PoloBlog.age = 24 print(PoloBlog.age) print(poloBlog.age) # 输出结果 24 24
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
Python - 面向对象编程 - 类变量、实例变量/类属性、实例属性
原文:https://www.cnblogs.com/poloyy/p/15178468.html