【python】详解类class的属性:类数据属性、实例数据属性、特殊的类属性、属性隐藏(二)

自上一篇python中的类,对象,方法,属性初认识(一)认识了类的基本架构,下面继续对类进行详解,更加深入了解类的属性、方法、访问控制这三个方面的类容。

紧接上一篇类的实例:

 

一、数据属性

1、在上面的person类中,“tall”、“name”、"age"和"weight "都被称为类的数据属性,但是它们又分为类数据属性和实例数据属性。

首先看一段代码,代码中分别展示了对类数据属性和实例数据属性的访问:

 

通过内建函数dir(),或者访问类的字典属性’_ _dict _ _'这两种方式都可以查看类有哪些属性,代码的输出为:

 

对于类数据属性和实例数据属性,可以总结为:

  • 类数据属性属于类本身,可以通过类名进行访问/修改
  • 类数据属性也可以被类的所有实例访问/修改
  • 在类定义之后,可以通过类名动态添加类数据属性,新增的类属性也被类和所有实例共有
  • 实例数据属性只能通过实例访问
  • 在实例生成后,还可以动态添加实例数据属性,但是这些实例数据属性只属于该实例

2、特殊的类属性:对于所有的类,都有一组特殊的属性

  • _ _ name_ _:类的名字(字符串)
  • _ _ doc _ _ :类的文档字符串
  • _ _ bases _ _:类的所有父类组成的元组
  • _ _ dict _ _:类的属性组成的字典
  • _ _ module _ _:类所属的模块
  • _ _ class _ _:类对象的类型
 

输出结果为:

 

3、属性隐藏:类数据属性属于类本身,被所有该类的实例共享;并且,通过实例可以去访问/修改类属性。英国留学一年的费用但是,在通过实例中访问类属性的时候一定要谨慎,因为可能出现属性"隐藏"的情况。

 

输出结果:

 

对于不可变类型的类属性,隐藏属性可以总结为:

  • 对于不可变类型的类属性person.tall,可以通过实例Bruce进行访问,并且"person.tall is Bruce.tall"

  • 当通过实例赋值/修改tall属性的时候将为实例Bruce新建一个tall实例属性,这时,“person.tall is not Bruce.tall”

  • 当通过"del Bruce.tall"语句删除实例的tall属性后,再次成为"person.tall is Bruce.tall"

对于可变类型的类属性,隐藏属性可以总结为:

  • 同样对于可变类型的类属性person.hobbies,可以通过实例Bruce进行访问,并且"person.hobbies is
    Bruce. hobbies"
  • 当通过实例赋值hobbies 属性的时候,都将为实例Bruce新建一个hobbies实例属性,这时,“person.hobbies is not
    Bruce. hobbies”
  • 当通过"del Bruce. hobbies"语句删除实例的hobbies属性后,再次成为"person. hobbies is Bruce.
    hobbies"
  • 当通过实例修改hobbies属性的时候,将修改Bruce. hobbies指向的内存地址(即person.hobbies),此时,“person.hobbies is not Bruce. hobbies”

注意,虽然通过实例可以访问类属性,但是,不建议这么做,最好还是通过类名来访问类属性,从而避免属性隐藏带来的不必要麻烦

猜你喜欢

转载自www.cnblogs.com/zhaolide/p/10031886.html