200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > Python - 面向对象编程 - 类变量 实例变量/类属性 实例属性

Python - 面向对象编程 - 类变量 实例变量/类属性 实例属性

时间:2023-09-29 05:11:09

相关推荐

Python - 面向对象编程 - 类变量 实例变量/类属性 实例属性

什么是对象和类

/poloyy/p/15178423.html

什么是 Python 类、类对象、实例对象

/poloyy/p/15178456.html

类变量、实例变量/类属性、实例属性

前言

只是叫法不一样

实例属性 = 实例变量

类属性 = 类变量

个人认为叫属性更恰当

类属性和实例属性区别

类属性,所有实例对象共享该属性实例属性,属于某一个实例对象的属性,用于描述具体的对象

从实际栗子了解类属性、实例属性

有一个表格,四个常见的明星

总结一下

四个人归类为明星每个明星都有两个属性:姓名、年龄明星这个群体具有一个属性:明星数量,在这张表是 4姓名和年龄等属性是用来描述具体的一个对象明星的数量是用于描述明星这个类别的

使用面向对象编程思想来总结的话

周润发、成龙、刘德华、周星驰都是实例对象他们都属于明星,明星是类属于实例对象的属性有:姓名、年龄,所以也叫实例属性属于明星类的属性有:数量,所以也叫类属性

类里面的三种类型变量

在所有方法之外定义的变量,称为类属性/类变量在方法内部,通过self.变量名方式定义的变量,称为实例属性/实例变量在方法内部,通过变量名=变量值方式定义的变量,称为局部变量

类属性

类属性在类中的定义

class 类名:类属性1 = 值类属性2 = 值def func(self): ...

类属性、类方法注意点

无论是类属性还是类方法,都无法像普通变量或者函数那样,在类的外部直接使用它们(类方法后面详解)可以将类看做一个独立的空间,类属性其实也是在类体中定义的变量,类方法是在类体中定义的函数需要通过类对象/实例对象来调用类属性ClassName.classProperty(类方法后面详解)

类属性的栗子

# 类属性class PoloBlog:# 这就是在所有方法之外 下面定义了 2 个类变量name = "小菠萝测试笔记"blog = "/poloyy/"# 通过类名调用类属性print(PoloBlog.name)print(PoloBlog.blog)# 输出结果小菠萝测试笔记/poloyy/

通过 Pycharm 的代码联想,可以看到 blog、name、__doc__ 三个类属性

类属性的调用方式

有两种

直接通过类名调用也可以通过类的实例对象调用

调用类属性的栗子

# 调用类属性的两种方式class PoloBlog:# 这就是在所有方法之外 下面定义了 2 个类变量name = "小菠萝测试笔记"blog = "/poloyy/"# 通过类名直接调用print(PoloBlog.name)print(PoloBlog.blog)# 修改类属性PoloBlog.name = "blogyuan"PoloBlog.blog = "/"# 通过实例对象调用修改后的类属性poloBlog = PoloBlog()print(poloBlog.name)print(poloBlog.blog)# 输出结果小菠萝测试笔记/poloyy/blogyuan/

通过类名修改类属性的值,会影响所有的实例化对象

实例对象修改类属性

# 修改类属性poloBlog.name = "小菠萝回来了"# 再看看类对象调用修改后的类属性print(PoloBlog.name)print(poloBlog.name)# 输出结果blogyuan小菠萝回来了

会发现,类名.name仍然返回之前的值,而实例对象.name会返回修改的值原因:实例对象.name本质上并不是修改类属性的值,而是在定义一个新的实例属性(下面详解)

动态添加类属性

PoloBlog.age = 24print(PoloBlog.age)print(poloBlog.age)# 输出结果2424

age 没有在类体中定义可以直接通过类名.new_property_name的方式定义一个新的类属性

实例属性

属于具体对象的属性,用于描述具体的对象只能通过实例对象访问,无法通过类名访问

实例属性的栗子

class PoloBlog:def __init__(self):# 在方法内部,通过 self.name 的方式定义的变量就是实例变量self.name = "小菠萝测试笔记"self.add = "/poloyy/"# 下面定义了一个 say 实例方法def say(self):self.age = 13# 实例化对象blog = PoloBlog()blog.say()print(blog.name, blog.add, blog.age)# 输出结果小菠萝测试笔记 /poloyy/ 13

重点:__init__ 会在实例化对象的时候自动调用,因此 blog1 创建成功就有 name、add 两个实例属性调用 say() 方法之后才有第三个实例属性 age

修改实例属性的栗子

blog.name = "小菠萝"blog.add = ""blog.age = 24print(blog.name, blog.add, blog.age)# 输出结果小菠萝 24

动态添加实例属性

blog.phone = 13501489999print(blog.phone)# 输出结果13501489999

上面也有说到,通过实例对象.属性名的方式并不会给类变量赋值,而是定义一个新的实例变量

综合栗子

# 综合栗子class PoloBlogObjectTest:# 类变量sum = 0# 初始化方法def __init__(self, name, age):# 实例变量self.name = nameself.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)# 打印类属性 nameprint(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 guycool guy12bad guycool guy

实例对象属性引用的查找过程

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。