来自OOPS背景,从链接看下面的代码看起来很奇怪
def f():
f.beencalled = True
return 0
Run Code Online (Sandbox Code Playgroud)
我的问题:
1)从上面的代码中,是f一个指向对象f的引用变量class 'function'?
2)我们beencalled向一个对象添加一个新属性f,所以现在'function'类没有beencalled定义这个属性,我们说该对象f是一个对象class 'function'?是否有意义?
1)是的:
>>> def f():
print(type(f))
>>> f()
>>> <class 'function'>
Run Code Online (Sandbox Code Playgroud)
2)function类没有新属性,但对象f有.向对象添加属性或从对象添加属性不会影响该类的其他对象将具有哪些属性:
>>> class A: pass
>>> a = A()
>>> a.var = 7
>>> b = A()
>>> b.var
Traceback (most recent call last):
File "<pyshell#19>", line 1, in <module>
b.newvar
AttributeError: 'A' object has no attribute 'var'
Run Code Online (Sandbox Code Playgroud)
python中的类比Java或C++中的类更灵活.对象可以具有未在其类中定义的属性,甚至缺少在其类中定义的属性!看这个:
>>> class A:
def __init__(self, a):
self.var = a
>>> obj = A(7)
>>> del obj.var #deletes the var attribute from obj, does not change the A class
>>> obj.var
Traceback (most recent call last):
File "<pyshell#28>", line 1, in <module>
obj.var
AttributeError: 'A' object has no attribute 'var'
>>> obj2 = A(6)
>>> obj2.var #obj2 is a new object, so the fact we deleted var from obj doesn't affect it
6
Run Code Online (Sandbox Code Playgroud)
编辑:经过一些搜索后,我找到了解释为什么选择这种行为的原因(来源):
为了实现用户定义的对象,我选择了最简单的设计; 一种方案,其中对象由一种新的内置对象表示,该对象存储指向由同一类的所有实例共享的"类对象"的类引用,以及一个被称为"实例字典"的字典,其中包含实例变量.
在此实现中,实例字典将包含每个单独对象的实例变量,而类对象将包含在同一类的所有实例之间共享的东西 - 特别是方法.在实现类对象时,我再次选择了最简单的设计; 类的方法集存储在字典中,其字符串是方法名称.这个,我称之为班级词典.为了支持继承,类对象还将存储对与基类对应的类对象的引用.当时,我对类非常天真,但我知道多重继承,最近已经添加到C++中.我决定只要我支持继承,我不妨支持一个简单的多继承版本.因此,每个类对象都可以有一个或多个基类.
在此实现中,使用对象的基础机制实际上非常简单.每当对实例或类变量进行更改时,这些更改都会简单地反映在基础字典对象中.例如,在实例上设置实例变量会更新其本地实例字典.同样,当查找对象的实例变量的值时,只需检查其实例字典中是否存在该变量.如果在那里找不到变量,那么事情会变得更有趣.在这种情况下,查找在类字典中执行,然后在每个基类的类字典中执行.
| 归档时间: |
|
| 查看次数: |
227 次 |
| 最近记录: |