资讯专栏INFORMATION COLUMN

Python 类的属性与实例属性

stefan / 2942人阅读

摘要:放假归来一概念类对象类名实例对象通过类创建的对象类属性类对象所拥有的属性。但是类本身的数据属性没有受到影响,仍存在类域中,可以通过类属性访问。因为相同名称的实例属性将屏蔽掉类属性。

放假归来 ~~~


一、概念

类对象:类名

实例对象:通过类创建的对象

类属性:类对象所拥有的属性。归类所有,被类对象和实例对象所共有。
类的公有属性可以在类外被访问。

实例属性:实例对象所特有的属性,类对象不能拥有,即不能通过类对象调用。
实例属性可以放在构造方法__init__()中,也可以在创建实例对象后,进行绑定。

二、举例说明

我们通过创建一个学生类来进行说明。

class Student1(object):
    version = 1.0                        # 类的公有数据属性
    __v = 66                            # 类的私有数据属性
    
    # 构造方法里的实例属性,在类创建实例时自动被调用
    def __init__(self ,name,score):        
        self.name = name 
        self.score = score 
    
    # 类的方法属性,通过类实例化对象访问
    def updateScore(self,new_score):    
        self.score = new_score

then,尝试通过类对象和实例对象来访问类的公有数据属性。对于实例没有而类有的属性,会继续查找类的属性。

>>> b = Student1("xlp","100")   
>>> Student1.version            # 通过类来访问类的数据属性
1.0
>>> b.version                    # 通过类实例访问类的数据属性,打印version属性 
1.0                    # 因为实例并没有该属性,所以会继续查找class的version属性 

but,当类属性和实例属性相同且混用的时候,会出现点问题。
我们先通过类来修改类的数据属性。修改后,类和实例对象均可访问。

>>>Student1.version += 0.1    
>>>Student1.version         # 或者b.version
1.1

再通过类实例对象来修改类属性:

>>>b.version += 0.1            # 试图通过类对象来修改类属性
>>>b.version                # 效果等同于b.version = Student.version + 0.1
1.2                 # 由于实例属性优先级高于类属性,因此会屏蔽掉类的version属性 1.1
>>>Student1.version 
1.1                 # 此时Student.version仍为1.1

其实,在上面实例对象修改类数据属性时,创建了一个名为version的新实例属性,覆盖了类属性的引用。
但是类本身的数据属性没有受到影响,仍存在类域中,可以通过类属性访问。
如果将b.version属性进行删除del,之后b.version就可以重新访问类数据属性了。

>>>del b.version            # 删除实例属性
>>>b.version             # 由于实例的version属性没有找到,类的属性就显示出来了
1.1

所以,实例属性和类属性不要使用相同的名字。因为相同名称的实例属性将屏蔽掉类属性。

可以通过实例绑定、访问实例的属性,举例说明:

>>> b.name                    
"xlp"
>>>b.updateSocore(100)        # 通过实例访问类方法属性
>>>b.score
100

但是,但是,但是,当类数据属性为可变对象时,比如dict类型,情况又会有点不一样了。例如:

当类属性为可变对象时,通过实例对象来修改类属性时,会修改类属性,且在删除实例属性时会报错。
所以,使用类对象来修改类属性,不要使用实例对象来修改类属性。


❤ thanks for watching, keep on updating...
点个赞再走吧

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/42619.html

相关文章

  • python中创建对象(object)

    摘要:实例变量与类变量事实上,字段除了独属于实例之外,跟普通变量没有什么差别,所以实例的字段也被称为实例变量。在类的定义中,与实例变量对应的还有类变量,类变量与实例变量类似,通过操作符来访问。类变量跟类的方法都可以被称为类的成员。 该系列文章: 《python入门,编程基础概念介绍(变量,条件,函数,循环)》 《python中的数据类型(list,tuple,dict,set,None)》...

    freewolf 评论0 收藏0
  • python基础教程:类

    摘要:类对象被创建时存在于类命名空间内的所有名称都是有效的属性名称。类的实例化,是使用函数表示法,可以把类对象看做是会返回一个新的类实例的函数。这就是可变对象作为类变量时的特性。类变量是所有类的实例共享的属性和方法,实例变量是每个实例独有的数据。 Python是面向对象的高级编程语言,在Python里面一切都是对象:数字、字符串、元组、列表、字典、集合等内置数据类型,以及函数、方法、类、模块...

    fish 评论0 收藏0
  • Python OOP 面向对象编程

    摘要:时代,如果需要手动继承,如多态多态是指,不同的子类对象调用相同的父类方法,会产生多态多样结果的编程特性。 参考:黑马程序员教程 - Python基础 面向对象 OOP三大特性,且三个特性是有顺序的: 封装 继承 多态 封装 指的就是把现实世界的事务,封装、抽象成编程里的对象,包括各种属性和方法。这个一般都很简单,不需要多讲。 唯一要注意的就是:推荐从小往大开始封装、开发类。比如手枪...

    weknow619 评论0 收藏0
  • Python方法(二) - 类继承

    摘要:在类内部的方法中使用时。类的私有方法两个下划线开头,声明该方法为私有方法,不能在类地外部调用。先在本类中查找调用的方法,找不到才去基类中找。如果在继承元组中列了一个以上的类,那么它就被称作多重继承。 类定义 类对象:创建一个类之后,可以通过类名访问、改变其属性、方法 实例对象:类实例化后,可以使用其属性,可以动态的为实例对象添加属性(类似javascript)而不影响类对象。 类...

    DevWiki 评论0 收藏0
  • Python 3 入门,看这篇就够了

    摘要:缩进不一致,会导致运行错误。变量变量在使用前必须先定义即赋予变量一个值,否则会报错数据类型布尔只有和两个值,表示真或假。 简介 Python 是一种高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。Python 由 Guido van Rossum 于 1989 年底在荷兰国家数学和计算机科学研究所发明,第一个公开发行版发行于 1991 年。 特点 易于学习:Python ...

    Shimmer 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<