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. Android Context完全解析,你所不知道的Context的各种细节

    Context相信所有的Android开发人员基本上每天都在接触,因为它太常见了.但是这并不代表Context没有什么东西好讲的,实际上Context有太多小的细节并不被大家所关注,那么今天我们就来学 ...

  2. Fragment的setUserVisibleHint方法实现懒加载,但setUserVisibleHint 不起作用?

    我们在做应用开发的时候,一个Activity里面可能会以viewpager(或其他容器)与多个Fragment来组合使用,而如果每个fragment都需要去加载数据,或从本地加载,或从网络加载,那么在 ...

  3. C#.NET常见问题(FAQ)-如何判断某个字符是否为汉字

    字符强制转换成int可以判断字符数值大小,在下面所示范围内的就是中文   此外还可以判断是否是数字或者字母,用char.IsLetter和char.IsDigit方法   从先这个范例可以看出,中文也 ...

  4. 使用docker api

    前提: 系统centos 7 docker version 1.10.3 使用systemd启动docker 访问方式: 修改/usr/lib/systemd/system/docker.servic ...

  5. Java Web部署到tomcat后,使用动态编译无法找到相关类的解决方案

    一.问题 动态编译java文件时(这个java文件虽引用了第三方jar包),如果这个过程发生在java命令行程序中,则正常编译.如果发生在JavaWeb中,然后此Java部署到Tomcat之后,执行动 ...

  6. 014-Go Web 对pg增删改查测试

    1:data/data.go package data import( "fmt" "database/sql" _"github.com/lib/p ...

  7. JS 处理Json数据事例

    JS从远端获取数据之后,往往还需要在处理一下,下面给出一个事例,供参考 将'[{"role_id":1,"enable":1},{"role_id&q ...

  8. Java实战_手把手编写记事本

    Java运用SWT插件编写桌面记事本应用程序 可实现windows系统桌面记事本基本功能.傻瓜式教学,一步一步手把手操作.小白也可自己编写出完整的应用程序. 须要工具:Eclipse(带SWT插件) ...

  9. Spring学习笔记二:注入方式

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6774608.html  我们说,IOC的实现方式是依赖注入,也就是把被依赖对象赋值到依赖对象的成员属性.怎么做 ...

  10. cocos2d-js Shader系列4:Shader、GLProgram在jsb(native、手机)和html5之间的兼容问题。cocos2d-js框架各种坑。

    为了让jsb也能顺利跑起滤镜效果,在手机侧折腾了2天,因为每次在真机上运行总要耗那么半分钟,而且偶尔还遇到apk文件无法删除导致运行失败的情况. 这个调试起来,实在让人烦躁加沮丧. 还好,测试上百轮, ...