一、类的三种方法
1、实例方法
def func(self):
由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self;
只能通过实例调用
2、静态方法
@staticmethod
def add():
由类调用,不需要对象;无默认参数。静态方法跟所在的类没有任何关系,也不能引用类里面的属性和方法
静态方法既可以直接使用类名去调用,还可以使用类的实例去调。
3、类方法
不用创建实例,就可以使用的方法
@classmethod (装饰器)
def func1(cls): cls指向类
由类调用; 至少一个cls参数;执行类方法时,自动将调用该方法的类复制给cls;
eg:
#coding=utf-8
class Person(object):
id = 12 #类静态成员在这儿定义,注意缩进
def __init__( self,name ):
self.name = name
self.__inName = 'ads'
@classmethod #类方法定义,用注解方式说明
def up(cls,a ): #这儿是cls,不是self
print cls,cls.__name__
return a+1
#创建类的实例
p = Person( "alpha" )
#调用类方法
print Person.up(20) #类名直接调用
print p.up(12) #通过实例对象调用 (实例可以调用类方法)
4、私有方法
类中方法名前面有两个下划线,表示是Python中的私有方法,类似于java中的private,不能在类外部调用(如__setId()),在类内部调用语法: self.__private_methods。
eg:
#coding=utf-8
class Person(object):
id = 12 #类静态成员在这儿定义,注意缩进
def __init__(self,name):
self.name = name
self.__inName = 'ads'
def __setId(self,id): #隐藏方法
Person.id = id * 2
def getId(self):
self.__setId(18) #类内部调用隐藏方法
return Person.id
p = Person("prel")
print p.getId() 通过类中的方法使用类的私有方法功能
5、类的构造方法
class Foo(object):
def __inti__(self,*args): 使用了元祖参数,对于变量不确定的情况。构造方法
if len(args)==2:
self.name=name
self.age=age
else:
print 'no salary'
def bar(self):
pass
obj=Foo() 实例化的时候,会执行__init__()这个构造方法
二、前三种方法对比
1、相同点和不同点
相同点:对于所有的方法而言,均属于类(非对象)中,所以,在内存中也只保存一份。
不同点:方法调用者不同、调用方法时自动传入的参数不同。
三、前三种方法的总结
类方法可以被类对象或实例调用,实例方法只能被实例调用,它只属于类的单个实例拥有,静态方法两者都能调用,它在类和实例间共享。Python实现了一定的灵活性使得类方法和静态方法,都能够被实例和类二者调用。
所以三者主要区别在于参数传递上的区别,实例方法隐含传的参数是类实例self,而类方法隐含传递的参数是类本身cls,而静态方法无隐含参数,主要为了类实例也可以直接调用静态方法。