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

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

时间: 2024-12-21 02:32:14

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

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

目录 #通过反射获取对象属性值并设置属性值 #获取对象的所有属性名称及类型 #判断对象是否包含某个属性 #通过反射获取对象属性值并设置属性值 0.定义一个类 public class User { public int Id { get; set; } public string Name { get; set; } public string Age { get; set; } } 1.通过属性名(字符串)获取对象属性值 User u = new User(); u.Name = "lily&

如何使用单机单网卡实现公司内、外网访问

在我所将要实施的一个项目中,某公司内部有两套网络系统实现内.外网的物理隔离,员工访问内.外网时使用的双网卡隔离器来切换实现上不同的网络.而随着业务和科技的进步,用户需要布署一套桌面云系统,用桌面云来打造内.外网络,在前端使用云终端一体机来连接桌面云服务器登陆桌面访问.这样一来就会产生很多问题: 1.因用户前期在将要布署桌面云系统的每个云终端位置只布置了一根网线,不是象其它公司要使用内.外网络都是在每个终端前布两根网线来切换不同网络. 2.云终端一体机上也只有一个网口,无法实现双网口隔离访问内.外

javascript的类方法,对象属性,原型方法的相关理解

1.对象方法,属性:是属于对象实例层次上的方法,没创建一个实例,此实例便有了相应的对象方法,实例可以使用对象方法. eg:function People(name){ //对象属性,公有的(即每个实例都有一个此属性或方法) this.name = name; //对象方法,公有的 this.introduce = function(){ alert('my name = '+this.name); }: } 2.类方法,属性(静态方法,属性):作用在类层次的,不需要生成实例已经存在的属性,在内存

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

一.获取对象属性和方法 Object.keys()for in 返回对象的可枚举属性和方法的名称数组. Object.getOwnPropertyNames() 返回的数组的所有属性(可枚举或不可枚举)直接找到给定对象. 1 // 创建一个对象的构造方法 2 function myObj(name, attr) { 3 this.name = name; 4 this.attr = attr; 5 6 this.sayHi = function () { 7 return 'hi everyon

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

其实attribute和property两个单词,翻译出来都是属性,但是<javascript高级程序设计>将它们翻译为特性和属性,以示区分.本文将详细介绍特性和属性的不同之处 定义 元素特性attribute是指HTML元素标签的特性 下面的id.class.title.a都是特性,其中a叫做自定义特性 <div id="id1" class="class1" title="title1" a='a1'></div

[python] 类常用的内置方法

内置方法 说明 __init__(self,...) 初始化对象,在创建新对象时调用 __del__(self) 释放对象,在对象被删除之前调用 __new__(cls,*args,**kwd) 实例的生成操作 __str__(self) 在使用print语句时被调用 __getitem__(self,key) 获取序列的索引key对应的值,等价于seq[key] __len__(self) 在调用内联函数len()时被调用 __cmp__(stc,dst) 比较两个对象src和dst __ge

python—类的属性和方法总结

一.类的属性总结(类的属性定义在方法外,对象的属性定义在方法内) 理解: 类的(静态)属性:(人类的五官,理解为变量) 类的(动态)方法:(人类吃穿住行,理解为一个函数,至少带一个参数self,指向类本身) 对象:类的实例化,之后才能有属性和方法 1)类的属性,也是公有属性:类的私有属性 2)对象的公有属性:对象的私有属性 3)函数局部变量:全局变量 4)内置属性 #!/usr/bin/env python #encoding:utf-8 var6 = "全局变量var6" class

Python类的内置方法

目录 1.new.init 2.str.repr 3.call 4.del 5.iter.next 6.getitem.setitem.delitem 7.getattr.setattr.delattr 8.getatrribute 9.enter.exit 10.get.set.delete.描述符(研究中,待补充) **(为了方便和美观,省略了各内置方法前后的__双下划线)** 1.new.init __new__方法是真正的类构造方法,用于产生实例化对象(空属性).重写__new__方法可

【速记速学】Python类的定义,属性,方法,访问性!

前言: Python 随着人工智能,机器学习,深度学习,AI 的发展,迅速成为宠儿. 今天,花 5 分钟时间,解读下Python中的类,定义,使用等. 如何定义自己的类呢? 01 类(对象) class dog(object)以上定义了一个dog对象,它继承于根类object. 02 类的属性 def init(self, name, dtype):self.name = nameself.dtype = dtype以上定义了dog对象的两个属性:name, dtype,通过init,这个系统函