python中可以定义类,为面向对象语言。
在定义个class时,可以定义3中类型的方法。包括‘实例方法’、“类方法”,“静态方法”其中不同之处:
类型 | 类访问 | 实例访问 | 意义 |
实例方法 | 不可以 | 可以 | |
类方法 | 可以 | 可以 | |
静态方法 | 可以 | 可以 |
1,实例方法
实例方法是最简单的一种方法,定义一个实例方法第一个默认的隐式传参标示调用当前方法的实例:
#encoding:utf-8 #小五 class Person(object): def __init__(self,name): self.name = name def syaHello(self): return self.name+'! hello!' def __str__(self): return 'Person name(%s)'%self.name p1 = Person('Bob') print p1.syaHello() #可以输出Bob! hello! print Person.syaHello() #报错:unbound method syaHello() must be called with Person instance as first argument (got nothing instead)
sayHello方法是实例的方法,所以类调用不到。
2,类方法
用@classmethod 装饰的方法是类方法,用类和实例都能访问到,传入的参数第一个是类,不是实例。所以访问不到实例的属性。
#encoding:utf-8 #小五 class Person(object): gender='女' def __init__(self,name): self.name = name @classmethod def sayD(self): print self.gender #可以正常输出‘女’ return self.name #报错:AttributeError: type object 'Person' has no attribute 'name' def sayHello(self): return self.name+'! hello!' def __str__(self): return 'Person name(%s)'%self.name p1 = Person('Bob') print p1.sayD()
3,静态方法
用@staticmethod装饰的方法称为静态方法,和前2种的主要区别是第一个参数不是默认,需要调用者传入。和java中的方法一样,可以用作工具方法。
#encoding:utf-8 #小五 class Person(object): gender='女' def __init__(self,name): self.name = name @staticmethod def sayD(self): return self def sayHello(self): return self.name+'! hello!' def __str__(self): return 'Person name(%s)'%self.name p1 = Person('Bob') print p1.sayD('sssss') #可以输出sssss print Person.sayD('aa') #可以输出aa