类及对象

在类中一开始声明成员不加'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
如果一个类从多个超类继承(具有两个相同名字的不同方法),需要注意一下超类的顺序:先继承的类中的方法会重写后继承类的方法.
posted @ 2017-06-21 17:45  jinzhongxiao  阅读(148)  评论(0编辑  收藏  举报