静态方法和实例方法
实例的方法就是在类中定义的函数
class中定义的全部是实例方法,实例方法第一个参数 self 是实例本身。在class中定义类方法,要加@classmethod;定义静态方法要加@staticmethod
类方法:方法的第一个参数都是类对象而不是实例对象(cls)
区别主要体现在两个方面:
1. 在外部调用静态方法时,可以使用”类名.方法名”的方式,也可以使用”对象名.方法名”的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。
2. 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制。
3. 类方法可以被对象调用,也可以被实例调用;传入的都是类对象,主要用于工厂方法,具体的实现就交给子类处理
4. 静态方法参数没有实例参数 self, 也就不能调用实例参
class Fun(object):
__count = 0
def __init__(self,path=''):
self.path = path
Fun.__count += 1
#静态方法
@staticmethod
def users(n):
Fun.n = n
return Fun.n
#实例方法
def jobs(self,work):
return Fun('%s' % work)
#类方法
@classmethod
def count(cls):
return cls.__count
#定制类(特殊方法)
def __str__(self):
return self.path
__repr__ = __str__
#调用
print Fun.count()
print Fun().jobs('job')
print Fun.users('Tom')
print Fun.count()
结果:
0
job
Tom
2
类方法和静态方法都可以被类和类实例调用,类实例方法仅可以被类实例调用。
类方法的隐含调用参数是类,而类实例方法的隐含调用参数是类的实例,静态方法没有隐含调用参数。
class Chain(object):
def __init__(self,path='/users'):
self.path = path
def users(self,path):
return Chain('%s/%s' % (self.path,path))
def __getattr__(slef,path):
return Chain('%s/%s' % (self.path,path))
def __str__(self):
return self.path
__repr__ = __str__
print Chain().users('Tom').etc.list
结果:
/users/Tom/etc/list
class Chian(object):
def __init__(self,path=''):
self.path = path
def __getattr__(self,path):
return Chain('%s/%s' % (self.path,path))
def __str__(self):
return self.path
def __call__(self,name):
return Chain('GET %s/:%s' %(self.path,name))
print Chain().users('tom').etc.list
结果
GET /users/:tom/etc/list