cls主要用在类方法定义,而self则是实例方法。ide
self, cls 不是关键字,彻底可使用本身写的任意变量代替实现同样的效果。函数
普通的实例方法,第一个参数须要是self,它表示一个具体的实例自己。
若是用了staticmethod,那么就能够无视这个self,而将这个方法当成一个普通的函数使用。
而对于classmethod,它的第一个参数不是self,是cls,它表示这个类自己。
>>> class A(object):作用域
def foo1(self):
print "Hello",selfget
@staticmethod
def foo2():
print "hello"it
@classmethod
def foo3(cls):
print "hello",cls
>>> a = A()
>>> a.foo1() #最多见的调用方式,但与下面的方式相同
Hello <__main__.A object at 0x9f6abec>
>>> A.foo1(a) #这里传入实例a,至关于普通方法的self
Hello <__main__.A object at 0x9f6abec>
>>> A.foo2() #这里,因为静态方法没有参数,故能够不传东西
hello
>>> A.foo3() #这里,因为是类方法,所以,它的第一个参数为类自己。
hello <class '__main__.A'>
>>> A #能够看到,直接输入A,与上面那种调用返回一样的信息。
<class '__main__.A'>class
---------------------------------------------------------------------------------变量
类的定义能够动态修改module
class MyTest:
myname = 'peter'
def sayhello(self):
print "say hello to %s" % self.myname
if __name__ == "__main__":
MyTest.myname = 'hone'
MyTest.sayhello = lambda self, name: "I want say hello to %s" % name
MyTest.saygoodbye = lambda self,name: "I do not want say goodbye to %s" % name
print MyTest().sayhello(MyTest.myname)
print MyTest().saygoodbye(MyTest.myname)
这里修改了MyTest类中的变量和函数定义, 实例化的instance有了不一样的行为特征。lambda
-------------------------------------------------------------------------------------object
1.Python是一门动态语言,任何实体均可以动态地添加或删除属性。
2.一个类定义了一个做用域。
3.类实例也引入了一个做用域,这与相应类定义的做用域不一样。
4.在类实例中查找属性的时候,首先在实例本身的做用域中查找,若是没有找到,则再在类定义的做用域中查找。
5.在对类实例属性进行赋值的时候,实际上会在类实例定义的做用域中添加一个属性(若是还不存在的话),并不会影响到相应类中定义的同名属性。
class A:
cls_i = 0
cls_j = {}
def __init__(self):
self.instance_i = 0
self.instance_j = {}
if __name__ == '__main__':
a = A()
print A.__dict__ #{'__init__': , '__module__': '__main__', 'cls_i': 0, 'cls_j': {}, '__doc__': None}
print a.__dict__ # {'instance_j': {}, 'instance_i': 0}
>>> a.cls_i
0
>>>
a.instance_i
0
在查找cls_i的时候,实例a的做用域中是没有它的,却在A的做用域中找到了它;在查找instance_i的时候,直接可在a的做用域中找到它。
若是咱们企图经过实例a来修改cls_i的值,那会怎样呢:
>>> a.cls_i = 1
>>> a.__dict__
{'instance_j': {}, 'cls_i': 1, 'instance_i': 0}
>>> A.__dict__
{'__init__': , '__module__': '__main__', 'cls_i': 0, 'cls_j': {},
'__doc__': None}
咱们能够看到,a的做用域中多了一个cls_i属性,其值为1;同时,咱们也注意到A做用域中的cls_i属性的值仍然为0;在这里,咱们实际上是增长了一个实例属性,并无修改到类属性。若是咱们经过实例a操纵cls_j中的数据(注意不是cls_j自己),又会怎么样呢:>>> a.cls_j['a'] = 'a'>>> a.__dict__{'instance_j': {}, 'cls_i': 1, 'instance_i': 0}>>> A.__dict__{'__init__': , '__module__': '__main__', 'cls_i': 0, 'cls_j': {'a': 'a'}, '__doc__': None}咱们能够看到a的做用域没有发生什么变化,可是A的做用域发生了一些变化,cls_j中的数据发生了变化。实例的做用域发生变化,并不会影响到该类的其它实例,可是类的做用域发生变化,则会影响到该类的全部实例,包括在这以前建立的实例.