1.静态方法
静态方法是指类中不需要通过实例对象(即,这类函数的第一个位置参数不是self,也不是self)来调用就可以使用的方法。需要注意的是,这类方法不需要通过实例对象来调用,但类的实例对象也是可以调用这类函数(按照java的原理理解的话,该方法在具体执行的时候可能的还是通过来调用的)。在python3中使用装饰器@staticmethod来声明静态方法。静态方法中不同操作类定义的属性和方法,所以静态方法只是托管于类的名称空间中。
class Static_Test_A:
@staticmethod
def fun_a(arg):
print(arg)
if __name__=='__main__':
Static_Test_A.fun_a('hello world')
ca=Static_Test_A()
ca.fun_a('hello,this is a new world')
其运行结果为:
hello world
hello,this is a new world
2.实例方法
实例方法必须通过类的实例对象来调用,所以这个函数的第一个位置参数必须是self。当使用类的实例对象来调用这类函数时,该实例对象会自动地赋值给self参数。除此之外,也可以显示地通过将实例对象作为第一个位置参数传入到实例方法中来调用该方法。
class Static_Test_A:
def fun_a(self,arg):
print(arg)
if __name__=='__main__':
ca=Static_Test_A()
ca.fun_a('hello world')
ca_1=Static_Test_A()
Static_Test_A.fun_a(ca,'hello, this is a new world')
其代码运行结果如下:
hello world
hello, this is a new world
3.类方法
类方法,顾名思义就是类对象所拥有的方法。其定义时,除了使用@classmethod装饰之外,该方法的第一个位置参数默认为cls。类方法既可以通过实例对象来引用,也可以通过类对象来引用。(Python中的类方法和Java中的静态方法、类方法概念相似。)
class People:
@classmethod
def getCountry(cls,value):
return(value+'new')
p=People()
p.getCountry('hello ')
People.getCountry('world ')
其代码运行结果为:
hello new
world new
另外,类方法可以对类对象的属性进行修改。
class People:
country='china'
@classmethod
def setCountry_2(cls,value):
cls.country=value
print(People.country)
People.setCountry_2('japan')
print(People.country)
代码运行结果为:
china
japan
而静态方法无法对类的属性进行修改的。(静态方法只是一段单纯的逻辑性代码,无法操作类的属性和方法)
class People:
country='china'
@staticmethod
def setCountry_1(value):
print("code is running")
country=value
print(People.country)
People.setCountry_1('japan')
print(People.country)
其代码运行结果为:
china
code is running
china
补充: JAVA面向对象和Python面向对象对比。
| Python | Java |
类变量 | 在类中直接定义 | static修饰的属性 |
实例变量 | 在__init__初始化块中定义 | 非static修饰的属性 |
类方法 | @classmethod修饰且参数列表中cls为第一默认参数的方法。(不能调用实例变量和实例方法) | static修饰的方法。不是操作实例属性和实例方法。(因为类属性和类方法的存在不依赖于实例,很有可能在类方法中调用实例属性和实例方法时,还没有对实例进行初始化) |
静态方法 | @staticmethod装饰的方法。该方法不能操作类的一些属性和方法。只是托管在了类的命名空间中。 | Java中的静态方法与类方法同名。 |
实例方法 | 不带任何装饰器的方法。不能使用实例操作类属性及方法(因为Python是一种弱类型语言,使用实例操作类属性时会自动为实例创建一个新的实例属性,覆盖类属性) | 非static修饰的方法,可以操作类属性和类方法。 |
权限控制 | Python中的权限控制全靠自觉,虽然使用下划线对属性的访问权限进行了控制,但仍然有方法对变量进行访问。 | private、default、protected、public |