Python 面向对象编程(OOP) 解析

0人阅读 评论(0) 收藏 举报


1.  类引用与类调用的区别

例:

class MyClass(object):
    foo = 100
    def __init__(self):
        print("Class initialized")
>>> MyClass.foo
100
>>> MyClass().foo
Class initialized
100

解析:

在上例中,MyClass 代表对类对象的引用,而MyClass()代表对类对象的调用,所以MyClass.foo输出了类的数据属性foo的值——100,而由于对类的调用会实例化类,所以MyClass().foo先通过特殊方法__init__()输出了字符串然后再输出数据属性foo的值。


2. 类属性和实例属性的区别 / dir() 与 __dict__ 的区别

例:

class MyClass(object): # 创建类MyClass  
    foo = 100  
>>> c = MyClass() # 创建类MyClass的实例c  
>>> dir(MyClass)
>>> dir(MyClass)
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'foo']
>>> MyClass.__dict__
mappingproxy({'__weakref__': <attribute '__weakref__' of 'MyClass' objects>, 'foo': 100, '__dict__': <attribute '__dict__' of 'MyClass' objects>, '__doc__': None, '__module__': '__main__'})
>>> dir(c) # 输出结果与dir(MyClass)一样
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'foo']
>>> c.__dict__ # 输出空字典  
{}  
>>> c.bar = 200 # 为实例c设置bar属性,这个属性是c的实例属性  
>>> dir(c) # 新增的bar属性显示在了输出的列表中
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'bar', 'foo']
>>> c.__dict__ # 新增的bar属性也显示在了实例的__dict__中  
{'bar': 200}  
>>> c.foo # 通过实例访问类的静态属性  
100  
>>> c.foo = 300 # 设置实例c的同名属性  
>>> c.foo # 此时实例c的实例属性foo遮蔽了它的类MyClass的同名类属性,所以输出结果是300而不是100  
300  
>>> dir(c) # 调用dir()方法,输出结果与之前一样的
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'bar', 'foo']
>>> c.__dict__ # 但是调用__dict__方法,能看到foo出现在输出中  
{'bar': 200, 'foo': 300}  
>>> dir(MyClass) # 与之前输出一致
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'foo']
>>> MyClass.__dict__ # 与之前输出一致
mappingproxy({'__weakref__': <attribute '__weakref__' of 'MyClass' objects>, 'foo': 100, '__dict__': <attribute '__dict__' of 'MyClass' objects>, '__doc__': None, '__module__': '__main__'})
解析:

1. dir()返回的是对象的属性的列表,而__dict__返回的是一个字典

2. dir()返回的结果还包含了对象的特殊属性和方法,实例会共享它的类的这些方法。

3. __dict__返回的结果是对象自己的属性,实例的__dict__不会包含其类的属性。



查看评论

JavaScript 精粹 基础 进阶(8)OOP面向对象编程(上)

面向对象编程,oop并不是针对与javascript,很多语言都实现了oop这样一个编程发法论,比如说java,c++,都是实现了oop的语言。概念与继承 概念 面向对象程序设计(Object-o...
  • u013861109
  • u013861109
  • 2016-12-20 15:26:46
  • 800

Python3 OOP面向对象编程最基本的类

小米路由器出了问题告别了一天网络,也不知道是出了什么问题。真有些怀疑被黑了,用了一年的密码居然怎么也不好用了。把路由器恢复了出厂设置又把密码彻底更新了一遍。由于网络折腾,都两天没有好好学习了。   ...
  • grey_csdn
  • grey_csdn
  • 2017-05-24 19:55:25
  • 344

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

类属性 在理解类属性之前要先搞清楚 实例属性 和 函数属性 之间的区别: 1. 实例属性:指的是实例化类对象的属性,需要在类中使用 self 关键字来将其和实例化对象绑定的属性。 2. 函数属性...
  • Jmilk
  • Jmilk
  • 2016-10-23 15:51:18
  • 1179

如何理解面向对象编程(OOP)

想要理解OOP,首先需要清楚什么是对象。            所谓对象就是由一组数据结构和处理它们的方法组成的,划重点 “数据” 包括对象的特性、状态等的静态信息; “方法” 也就是行为,包括该对象...
  • zhouying_12345
  • zhouying_12345
  • 2017-04-27 09:23:42
  • 630

面向对象编程(OOP)三大特点

 ---------------------------------------------------------------------------------------------------...
  • zzmitcast
  • zzmitcast
  • 2008-07-26 15:37:00
  • 4829

全面深入JavaScript OOP面向对象编程

分享一套最全面通俗易懂JavaScript OOP面向对象编程 课程讲师:风舞烟  课程分类:Javascript 适合人群:高级 课时数量:24课时 用到技术:JS OOP 涉及项目...
  • u013890660
  • u013890660
  • 2014-07-09 11:40:08
  • 890

OOP(1) 为什么要用面向对象编程,它的优点是什么?

说在前面的话身边总能听到有人问这样的问题:学编程哪一种语言比较好? 我觉得在挑选一门语言进行学习之前,你需要做的一件事情就是打开一本介绍这门语言的书,看看他的前言,里边会告诉你这个语言到底是做什么的...
  • huiyuanliyan
  • huiyuanliyan
  • 2016-06-21 11:37:50
  • 3730

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

目录目录 self 和绑定 调用非绑定的方法self 和绑定在 Python 中 self 变量是特殊的, 其用于在实例方法中引用该方法所绑定的实例, 换句话说就是 Python 在实例化对象时会自动...
  • Jmilk
  • Jmilk
  • 2016-10-26 19:59:22
  • 1189

LabVIEW OOP基础

LabVIEW OOP基础本文介绍LabVIEW OOP编程的基础知识。 面向过程编程与面向对象编程的区别 属性和方法 类和对象 封装 继承 动态分配 丰富的快捷键 面向过程编程和面向对象编程的区别 ...
  • shmily0923
  • shmily0923
  • 2016-06-23 14:36:35
  • 1620

面向对象编程(OOP)和函数式编程(FP)的思考

最近看过不少 JavaScript 的类(实际是嵌套 function),自己也写了一些,发现一个值得思考的问题。有的作者可能为了提高一点性能,喜欢有事没事把方法里面的某个变量做成类的字段(att...
  • inelm
  • inelm
  • 2007-07-24 17:17:00
  • 508
    个人资料
    持之以恒
    等级:
    访问量: 2571
    积分: 302
    排名: 25万+
    文章存档