在类中一开始声明成员不加'self',可将其理解为类成员,访问使用 类名或者实例名字.变量
def MemberCounter:
member = 0
def __init__(self):
MemberCount.members += 1
m1 = MemberCounter()
print MemberCounter.member
Output: 1
m2 = MemberCounter()
print MemberCounter.member
Output: 2
类成员变量是不可变(字符串,元组, 数字变量等)或者可变(列表,字典等)在类内部使用的区别
#!/usr/bin/env/ python
# -*- coding: utf-8
class MemberCounter:
members = 0
objlist = []
objturple = (3,)
def __init__(self):
#此处只能用MemberCounter.members
MemberCounter.members += 1
#此处使用self.objlist或者MemberCounter.objlist均可
self.objlist.append('1')
m1=MemberCounter()
print MemberCounter.members, MemberCounter.objlist
print m1.members, m1.objlist
m2=MemberCounter()
print MemberCounter.members,MemberCounter.objlist
print m2.members, m2.objlist
输出:
1 ['1']
1 ['1']
2 ['1','1']
2 ['1','1']
但是在外部使用的时候采用'类名或者实例名字.变量'的形式(如MemberCounter.objlist),两者的区别应该和他们做函数参数的原理类似,在列表/字典做函数参数的时候,函数可以改变实参的值,但是字符串或者数字变量等作为函数参数时,在函数使用会拷贝副本,外部的变量保持原值.
类作用域的变量可以被所有的实例访问,但是在实例中重新绑定members?
m1.members = "Two"
print m1.members
print m2.members
输出:
Two
2
新的numbers被写到了m1特性中,相当于创建了m1中的self.members, 屏蔽了类范围内的变量.
Note:
1.python能够改变变量作用域的代码段是def、class、lamda.
2.if/elif/else、try/except/finally、for/while 并不能涉及变量作用域的更改,也就是说他们的代码块中的变量,在外部也是可以访问的
继承
检查继承 eg:issubclass(SPAMFilter, Filter)
得到类的基类: SPAMFilter.__bases__
检查一个对象是否为一个类的实例: isinstance()
对象属于那个类 : s.__class__ 或者type(s)
查看对象所存储的值:使用__dict__特性
多重继承
eg:class TalkingCalculator(Talker,Calculator):pass
如果一个类从多个超类继承(具有两个相同名字的不同方法),需要注意一下超类的顺序:先继承的类中的方法会重写后继承类的方法.