class B(object):
def __init__(self):
self.name ='mink'
class A(B):
name = 'kk'
a = A()
# pirnt 'mink'
print a.name
我访问 a.name 会访问 B 的实例属性,而不是 A 的类属性,是不是我在创建实例 a 的时候默认用 B 的构造方法创建的啊?
1
Kilerd 2016-01-07 16:35:16 +08:00
建议看看 类的继承和派生 相对应内容
|
2
lovedboy 2016-01-07 16:41:11 +08:00
|
3
ljdawn 2016-01-07 16:57:39 +08:00
实例的属性存储在实例的__dict__中,类属性存储在类的__dict__中.查找时先查找实例的__dict__,然后才是类的__dict__
|
4
knightdf 2016-01-07 16:59:32 +08:00
__new__才是实例构造器,__init__是实例初始化的, new 后自动调用 init ,然后你就懂了
|
5
hzm0318hzm 2016-01-07 17:01:11 +08:00
A 也需要__init__函数,在里面赋值就行了
|
6
cizixs 2016-01-07 17:05:25 +08:00
类 A 可粗略写成这样:
class A(object): name = 'kk' def __init__(self): self.name ='mink' 包括了实例属性和类属性, python 访问的时候会先访问实例属性,然后是类属性,你可以用 a.__class__.ame 来访问类属性。 |
7
lixiaohan 2016-01-07 17:12:43 +08:00
对于 A 来说 name 是它的类变量 而不是实例变量,其实它本身没有实例变量, 所以就用 B 的 就是这个结果了。
|
8
playniuniu 2016-01-07 17:15:27 +08:00
|
9
mink OP 感谢你们的回答,我想问的是这样的。当 A 的实例 a 创建以后, a 的__dict__的空的,但是我在通过 A 继承 B 并且 B 中设置__init__。 实例 a 的__dict__里有了 name 这个属性,但是她是来自 B 的__init__。
```python class B(object): def __new__(cls): print 'new:', cls.name # A print cls.__name__ return super(B, cls).__new__(cls) def __init__(self): print 'init:', self.name self.name = 'mink' class A(B): name = 'kk' a = A() print a.name ``` 这里我打印了一下 cls.__name__ 竟然是 A , cls 参数不是当前类么,有点费解 |
10
tonghuashuai 2016-01-07 17:50:54 +08:00
|
11
billlee 2016-01-07 21:11:32 +08:00
就是实例的属性会覆盖掉类属性嘛
|
12
vixvix 2016-01-07 22:27:20 +08:00
|
14
mink OP 其实我想知道实例创建时初始化过程,如果
class B(object): def __init__(self): self.name = 'mink' class A(object): name = 'kk' a = A() # pritn {'name': 'mink'} # print 'mink' print a.__dict__ print a.name 我现在确定的是当实例 a 被创建出来时,如果 A 类没有初始化函数__init__就会在父类找。如果找到就执行父类的__init__,如果找不到几继续往上找。以下是测试的 class C(object): def __init__(self): print 'in c' self.name = 'c mink' class B(object): def __init__(self): print 'in b' self.age = 3 class A(B, C): name = 'kk' a = A() # print {'age': 3} # pirnt 'kk' print a.__dict__ print a.name 因为他在 b 中找到了__init__就不往上继续查了,这样 a.name 就会返回类的 name 也就是 kk class C(object): def __init__(self): print 'in c' self.name = 'c mink' class B(object): age = 3 class A(B, C): name = 'kk' a = A() # print {'name': 'c mink'} # pirnt 'c mink' print a.__dict__ print a.name |
15
mink OP 这样就找到了,所以能找到 C 中的 'c mink'。 感谢你们的回答
|