目录

  • 目录
  • 类属性
    • 调用类属性
    • 查看类属性
    • 特殊的类属性
  • 类方法
    • 真构造器 __new__

类属性

在理解类属性之前要先搞清楚 实例属性函数属性 之间的区别:
1. 实例属性:指的是实例化类对象的属性,需要在类中使用 self 关键字来将其和实例化对象绑定的属性。
2. 函数属性:指的是定义在函数体内的属性,其可以是实例属性,也可以是类属性。
3. 类属性:是一个与实例无关的属性,比起实例属性而言,它更加的 静态,当定义在类方法中时,并不会因为方法调用的完毕而被回收。类属性,在类定义中直接指定,无须 self 关键字,所以也只能在类中使用。所以类属性只能通过类的成员方法或类调用来更新。

静态:表示一个对所有实例而言都是相对固定的值

NOTE:类属型也称之为 静态属性,当我们定义一个类静态属性时,无须实例化对象,直接可以通过类来调用该属性,直到这个类被回收为止。如果在 Java 中,你需要使用 static 来指定。当然类的实例化对象也可以通过句点标识符来调用和更改,但此时的更改并不会影响原来的类静态属性。

EXAMPLE:

In [48]: class AClass(object):...:     LOG = 'Define a class'...:In [49]: AClass.LOG
Out[49]: 'Define a class'In [50]: a_object = AClass()In [51]: a_object.LOG
Out[51]: 'Define a class'In [52]: a_object.LOG = 'Call the static attribute.'In [53]: a_object.LOG
Out[53]: 'Call the static attribute.'In [54]: AClass.LOG
Out[54]: 'Define a class'

通过这个例子可以看出类属性的调用可以完全无需实例化一个类对象。

调用类属性

注意:在类定义的函数体中调用类属性,需要通过 类名结合句点标识符 的方式来调用,否则会出发 NameError

In [93]: class AClass(object):...:     LOG = 'Define a class'...:     def my_func(self):...:         print ''.join(['log: ', AClass.LOG])# 函数体中...:     print ''.join(['log is: ', LOG])# 类体中...:...:
log is: Define a classIn [91]: a_object = AClass()In [92]: a_object.my_func()
log: Define a class

查看类属性

Python 为此提供了两个方法:

  • 通过 dir() 来查看类属性
In [55]: dir(AClass)
Out[55]:
['LOG','__class__','__delattr__','__dict__','__doc__','__format__','__getattribute__','__hash__','__init__','__module__','__new__','__reduce__','__reduce_ex__','__repr__','__setattr__','__sizeof__','__str__','__subclasshook__','__weakref__']
  • class.__dict__ 来查看类属性,等效于vars(AClass)
In [83]: AClass.__dict__
Out[83]:
dict_proxy({'LOG': 'Define a class','__dict__': <attribute '__dict__' of 'AClass' objects>,'__doc__': None,'__module__': '__main__','__weakref__': <attribute '__weakref__' of 'AClass' objects>})

两者的区别在于:前者仅能查看类属性的列表,后者可以查看类属性的键值对字典。

特殊的类属性

从上述的例子可以看出类中处理我们定义的 LOG 属性之外还有很多以双下划线 “__” 开头和结尾的属性,这些属性都是 Python 的特殊属性。

特殊属性 作用
C.name 类的名字(String)
C.doc 类的文档(String)
C.bases 子类的父类元组(Tuple)
C.dict 类的属性字典(Dict)
C.module 类所有的模块名称
instance.class 类实例对象的类名称

NOTE:其中 __dict__ 是一个包含了类属性的字典,方 Python 解析器访问一个类属性时,就会在这个字典中搜索。如果在该类的字典中没有搜索到,那么就会到该类的父类的属性字典中搜索。这样的话就能够将不同类之间的属性名隔离开来,在子类中对属性字典的修改并不会影响到父类的属性字典。

类方法

类方法就最基本的特征就是需要传递一个 class 对象作为方式的实参。

真·构造器 __new__()

__init__() 相比 __new__() 才是真正的构造器,实际上,在 Python 解析器中是先调用了 __new__() 生成一个实例,再将该实例对象传入 __init__() 实现初始化操作。但 __new__() 很少需要我们去重载,一般只有在派生了不可变类型的子类后需要重载,EG. 派生 String/Int/Tuple 等

为什么说 __new__() 是真·构造器呢?
因为这个特殊的类方法是真的返回了一个类的实例对象,而不像 __init__() 是传入了一个实例化对象。

EXAMPLE:不可表类型的派生

class RoundFloat(float):def __new__(cls, val):return float.__new__(cls, round(val, 2)) #因为 __new__ 是一个类方法,所以我们要显式的传递一个类对象

类 RoundFloat 是类 float 的子类,我们通过重载父类的 __new__() 构造器来定制一个新的不可变类型(Python 2.2之后将类和类型统一了,所以可以继承 Python 的内置数据类型)。当实例化 RoundFloat 的对象时,实际上是实例化了Python 内置数据类型 Float 的对象,并对这个对象做了一些定制化的操作(round(val, 2))。
NOTE:即便我们也可以通过重载 __init__() 来实现这个结果,但这里却不能这么做。因为如果 __new__() 没有被重载的话,仍会默认调用父类 Float 的构造器,创建 Float 类型的对象,而不是创建现在的 RoundFloat 类型对象。这也是两者的本质区别。

Python 进阶_OOP 面向对象编程_类属性和方法相关推荐

  1. Python 进阶_OOP 面向对象编程_实例属性和方法

    目录 目录 构造器和解构器 构造器 __init__ 真构造器 __new__ 解构器 __del__ 实例方法 Python 中的 抽象方法 实例属性 查看实例属性 实例属性和类属性的区别 访问不可 ...

  2. Python 进阶_OOP 面向对象编程_类和继承

    目录 目录 类 最简单的类 类方法 构造器 __init__ 创建一个类 实例化一个对象 调用实例的方法和属性 创建子类 使用 super 来调用父类的构造器 实例化子类对象 调用子类的属性和方法 类 ...

  3. Python 进阶_OOP 面向对象编程_组合与继承

    #目录 前言 组合 派生 通过继承来覆盖重载方法 最常用的重载场景实例方法的重载 从标准类中派生类方法的重载 前言 我们定义一个类是希望能够把类当成模块来使用,并把类嵌入到我们的应用代码中,与其他的数 ...

  4. Python 进阶_OOP 面向对象编程_静态方法和类方法

    目录 目录 静态方法 类方法 使用函数修饰符来声明静态方法和类方法 静态方法 静态方法仅是类中的函数, 不需要绑定实例, 也就是说静态方法的定义不需要传入 self 参数. 静态方法不属于类的某一个实 ...

  5. python进阶《面向对象编程》类和对象

    目录 零.前言 一.面向对象编程 (一)概念理解 二.类和对象的概念 (一)面向对象的两个重要概念类和对象. (二)类的解释   1.创建类   2.类属性(区别于下面的对象属性) (三)对象的解释 ...

  6. Python 进阶_OOP 面向对象编程_self 的实例绑定

    目录 目录 self 和绑定 调用非绑定的方法 self 和绑定 在 Python 中 self 变量是特殊的, 其用于在实例方法中引用该方法所绑定的实例, 换句话说就是 Python 在实例化对象时 ...

  7. python完全支持面向对象编程_[Python] 类与面向对象编程

    1. class语句 类通常是由函数.变量和属性组成的集合.使用class语句可以定义类,例如: class Account(object): num_accounts = 0 def __init_ ...

  8. 初学者python笔记(面向对象编程、类与对象)

    文章目录 面向对象设计 类与对象的概念 1.类与对象的本质 2.面向对象设计 到 面向对象编程 3.类实例化 4.例如一个学校类 面向对象编程 1.案例 2.面向对象语言和面向对象编程之间的关系 3. ...

  9. Python笔记_23_正则相关函数_类中的方法_装饰器_异常

    文章目录 正则相关函数 search 和 match split 切割 sub 替换 finditer 匹配字符串中相应内容,返回迭代器 compile 指定一个统一的匹配规则 正则表达式的修饰符 类 ...

最新文章

  1. RabbitMQ基本概念(一)-RabbitMQ的优劣势及产生背景
  2. 机器人瓦力漫威_86、机器人瓦力
  3. ubuntu安装python-mysqldb
  4. Ubuntu 下配置 NFS
  5. 通过Spring集成进行消息处理
  6. 一步步构建大型网站架构 [转]
  7. 一年换7家公司,95后跳槽多疯狂
  8. python课堂点名_Python制作课堂点名器,原来还能这么玩!
  9. IDEA 配置Java环境
  10. 【PX4学习笔记】2. 真正开始入门px4开发
  11. 使用短信登录和注册的流程
  12. react 逆地理 高德地图_react高德地图默认卫星图设置
  13. 2920集五福_支付宝集五福攻略 ▏顺便学点营销活动传播套路
  14. 超实数探索浪潮波及中国数学界
  15. android全屏视频播放,JieCaoVideoPlayer真正实现Android的全屏视频播放
  16. 时间都知道 作者: 随侯珠 txt格式下载
  17. ARM、MCU、DSP、FPGA、SOC各是什么?区别是什么?(转)
  18. 面试小技巧----腾讯线上培训班
  19. uni app ios 苹果内购
  20. 在Windows Server 2003中启用Windows XP的桌面主题

热门文章

  1. mac mysql编码修改_mac 下修改mysql数据库的编码格式
  2. mongodb cond 模糊查询_为了实现在线库的复杂查询,你还在双写吗?
  3. Java中普通字符串转json_java普通对象和json字符串的互转
  4. Java扫描注解下的包_使用Spring mvc 利用java的反射技术,来扫描对应包下的注解请求url 统一保存在数据库中...
  5. c++list支持索引吗_还在为不懂Python切片操作及原理而苦恼吗?漫画帮你立马理解掌握...
  6. python pil无法安装_解决virtualenv下安装Python PIL的support not available问题
  7. CMU贺斌教授团队提出FAST-IRES技术,利用高密度EEG产生脑信号源的动态图像
  8. 重磅!UCSF的研究者利用脑机接口首次让患者输出完整句子,展现恢复语言沟通的潜力...
  9. 通过神经图稳定对脑机接口的即插即用控制,四肢瘫痪患者可以轻松控制电脑光标...
  10. VR规格表出来啦!Rift,Vive,PSVR,Acer和HP