python类内init外声明的属性与init内声明的对象属性的访问和操作区别(面试题)

1.在ipython中输入以下代码,其输出会是什么?

In [1]: class ClassOut:
...: out_mem = 'out_mem'
...: print out_mem
...: def __init__(self):
...: inner_mem = 'inner_mem'
...: self.inner_mem = 'self.inner_mem'
...: self._inner_mem = 'self._inner_mem'
...: self.out_mem = 'self.out_mem'
...: In [2]: out = ClassOut() In [3]: out.out_mem In [4]: out._inner_mem In [5]: out.inner_mem In [6]: class ClassOut:
...: out_mem = 'out_mem'
...: print out_mem
...: def __init__(self):
...: inner_mem = 'inner_mem'
...: self.inner_mem = 'self.inner_mem'
...: self._inner_mem = 'self._inner_mem'
...: self.out_mem1 = 'self.out_mem1'
...:
out_mem In [7]: out = ClassOut() In [8]: out.out_mem In [9]: ClassOut.out_mem In [10]: ClassOut.out_mem1 In [11]: out._inner_mem In [12]: out.out_mem = 'out_mem modified by object' In [13]: ClassOut.out_mem In [14]: out.out_mem In [15]: out.new_mem = 'clas' In [16]: out.new_mem In [17]: o = ClassOut() In [18]: o.out_mem In [19]: ClassOut.out_mem In [20]: ClassOut.out_mem = 'out_mem modified by Class' In [21]: o.out_mem

考察:

1. python解释器处理解释class

2. 类的初始化定义方法

3. 类的__init__方法 与 class object成员定义, class instance成员的定义

4. 类定义成员时的命名约定

5. class object  与 class instance的区别

6. class object 与 class instance在处理缺失成员访问时查询域优先级的区别

7. class 定义 __private_mem 不被外部发现的元婴? (被重命名为_[class_name]__private_mem)!!!详见如下代码!

In [48]: class ClassOut:

...: out_mem = 'out_mem'

...: print out_mem

...: def __init__(self):

...: inner_mem = 'inner_mem'

...: self.inner_mem = 'self.inner_mem'

...: self._inner_mem = 'self._inner_mem'

...: self.out_mem1 = 'self.out_mem1'

...: self.__private_mem = 'self.__private_mem'

...:

out_mem

In [49]: no = ClassOut()

In [50]: no.__private_mem

---------------------------------------------------------------------------

AttributeError Traceback (most recent call last)

<ipython-input-50-36dd351a1b65> in <module>()

----> 1no.__private_mem

AttributeError: ClassOut instance has no attribute '__private_mem'

In [51]: no._ClassOut__private_mem

Out[51]: 'self.__private_mem'

8.1. 不能直接给对象设置属性?

>>> obj = object()
>>> obj.name = "whatever"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'name'

但是为什么这样就可以呢:

>>> class Object(object):pass
...
>>> Obj = Object()
>>> Obj.name = "whatever"
>>> Obj.name
'whatever'
>>>

答: 现在你给第二个代码块中的Object加上属性 __slots__ 试试:

>>> class Object(object):
... __slots__ = {}
...
>>> Obj = Object()
>>> Obj.name = "whatever"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Object' object has no attribute 'name'

会发现抛出了同样的异常。 object 、 list 、 dict 等内置函数都如此。

拥有 __slots__ 属性的类在实例化对象时不会自动分配 __dict__ ,而obj.attr 即 obj.__dict__['attr'], 所以会引起 AttributeError

对于拥有 __slots__ 属性的类的实例 Obj 来说,只能对 Obj 设置__slots__ 中有的属性:

>>> class Object(object):
... __slots__ = {"a","b"}
...
>>> Obj = Object()
>>> Obj.a = 1
>>> Obj.a
1
>>> Obj.c = 1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Object' object has no attribute 'c'

详细见 Python-slots-doc

python类内init外声明的属性与init内声明的对象属性的访问和操作区别的更多相关文章

  1. C#通过属性名字符串获取、设置对象属性值

    之前理工项目从这个博客找到了相对应的方法:C#通过属性名字符串获取.设置对象属性值 https://www.cnblogs.com/willingtolove/p/12198871.html

  2. Python 类中方法的内部变量,命名加'self.'变成 self.xxx 和不加直接 xxx 的区别

    先看两个类的方法: >>> class nc(): def __init__(self): self.name ='tester' #name变量加self >>> ...

  3. python 类(object)的内置函数

    python 类(object)的内置函数 # python 类(object)的内置函数 ### 首先 #### 以__双下划线开头的内置函数 __ #### __往往会在某些时候被自动调用,例如之 ...

  4. Python笔记_第三篇_面向对象_8.对象属性和类属性及其动态添加属性和方法

    1. 对象属性和类属性. 我们之前接触到,在类中,我们一般都是通过构造函数的方式去写一些类的相关属性.在第一次介绍类的时候我们把一些属性写到构造函数外面并没有用到构造函数,其实当时在写的时候,就是在给 ...

  5. python类(2)

    #从python开始学习编程 学习笔记 以后看书时注意一下书上表述:好像是类属性attribute,对象特性property,对象方法 1.对于一个类下的全部个体来说,某些属性可能存在个体差异.不是所 ...

  6. 区分元素特性attribute和对象属性property

    × 目录 [1]定义 [2]共有 [3]例外[4]特殊[5]自定义[6]混淆[7]总结 前面的话 其实attribute和property两个单词,翻译出来都是属性,但是<javascript高 ...

  7. 更新AD对象属性值

    1. 对于Set-ADUser不包含的对象属性,可以采用replace来操作 Set-ADUser -Identity 'UserA' -Replace @{userWorkstations = 'C ...

  8. 转: JavaScript 获取对象属性和方法

    一.获取对象属性和方法 Object.keys()for in 返回对象的可枚举属性和方法的名称数组. Object.getOwnPropertyNames() 返回的数组的所有属性(可枚举或不可枚举 ...

  9. python类属性和类方法(类的结构、实例属性、静态方法)

    类属性和类方法 目标 类的结构 类属性和实例属性 类方法和静态方法 01. 类的结构 1.1 术语 —— 实例 使用面相对象开发,第 1 步 是设计 类 使用 类名() 创建对象,创建对象 的动作有两 ...

随机推荐

  1. 轻量级分布式文件系统FastDFS使用安装说明手册(新手入门级)

    轻量级分布式文件系统FastDFS使用安装说明手册(新手入门级) 实验室所在的课题组以研究云计算为主,但所有的研究都是在基于理论的凭空想像,缺少分布式环境的平台的实践,云计算神马的都是浮云了.因此,我 ...

  2. C#.NET常见问题(FAQ)-如何修改Form不能修改窗体大小

    把FormBorderSytle改一下就可以了,改成FixedSingle或者Fixed3D都可以   更多教学视频和资料下载,欢迎关注以下信息: 我的优酷空间: http://i.youku.com ...

  3. SuperMap打包部署要点

    折腾了一段时间,终于要发布一个版本了,但SuperMap程序怎么发布呢,需要些什么必要条件呢?本来想问问超图的技术人员的,但都没人理我,估计都去开大会去了. 下面是自己测试出来的结果,主要是根据Sup ...

  4. .geodatabase与gdb的相互转换

    .geodatabase长得是gdb的全称,确实它们有一定的关系,但也有区别. 简单认识一下 有人也问过我,gdb外表像个文件夹,是怎么实现的.gdb数据库是ESRI特有的数据库,它是一些数据集定义. ...

  5. 【iOS开发】如何用 Swift 语言进行LBS应用的开发?

    本文分为三部分,第一部分详解用Swift语言开发LBS应用,并给出完整的示例与源代码:第二部分介绍如何申请LBS密钥,第三部分是综合示例查看,扫描二维码即可查看示例demo. 第一部分 使用Swift ...

  6. LintCode: 3 Sum

    C++ 把3个数求和,转变为2个数求和 1. 把数组排序 2. 注意过滤重复值 3. 从前到后遍历,游标i 4. 从后边数中找start + end = -arr[i]的2 sum 5. start ...

  7. OpenGL 核心技术之立方体贴图

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家.特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...

  8. 从0開始写MyScrollView

    从0開始写MyScrollView 上篇文章对ScrollView的详细实现进行了分析.本文依据上篇分析的结果.自己动手写一个ScrollView. step1 尾随手指滑动,非常easy.重写2个函 ...

  9. 【DB2】通过db2top找到会话对应的ip地址

    1.进入db2top监控界面 2.按l进入到会话界面 根据上图我们可以看到现在有一个应用在连接数据库,我们可以查看引用的具体信息 3.按a,然后输入应用的ID(ID为第一列对应的数字,上图的ID为29 ...

  10. Servlet路径跳转问题

    Servlet中路径跳转(服务器端跳转)JSP 1.相对路径  注意这里的相对含义,相对于谁而言 经过多次试验总结,servlet相对路径跳转相对于servlet配置的xml路径(或servlet3. ...