一、property函数
学过Java的朋友应该对Java中类的属性和方法不会感到陌生,在Python中也一样,类中定义的属性方法(在没有增加访问限制的情况下)都可以通过实例化的队形进行访问,如下:
# _*_ coding:utf-8 _*_
class A:
def __init__(self):
self.w=0
self.h=0
def getWH(self):
return self.w,self.h
def setWH(self,size):
self.w,self.h=size
运算结果:
===========RESTART: C:\Users\Mr_Deng\Desktop\test.py===========
>>> testA=A()
>>> testA.getWH()
(0, 0)
>>> testA.setWH([10,20])
>>> testA.getWH()
(10, 20)
>>>
就像上面一样在没有对属性和方法进行访问权限控制的情况下,可以通过实例化的对象访问类中的属性和方法。这里先介绍一个函数:Property,该函数可以将类中的定义的方法当做参数,如下:
# _*_ coding:utf-8 _*_
__metaclass__=type
class A:
def __init__(self):
self.w=0
self.h=0
def getWH(self):
return self.w,self.h
def setWH(self,size):
self.w,self.h=size
size=property(getWH,setWH)
运算结果:
===========RESTART: C:\Users\Mr_Deng\Desktop\test.py===========
>>> testA=A()
>>> testA.size
(0, 0)
>>> testA.size=11,22
>>> testA.size
(11, 22)
>>>
注:property函数可以用0,1,2,3或者4个参数来调用,若果没有参数,产生的属性既不可以读也不可以写。property函数四个参数分别是fget、fset、fdel、doc。在上面的例子中,将getWH和setWH函数作为property函数的两个参数并将property函数创建的属性赋给size,通过这种方法,可以使得对类中的操作变得像访问属性一样。
二、静态方法和类成员方法
在python中静态方法和类成员方法的区别主要在于,静态方法定义中没有self参数,能够被类本身直接调用。类方法定义时需要名为cls的参数,类成员方法可以直接用类的具体对象调用。静态方法和类成员方法的定义和使用如下:
__metaclass__=type
class MyClass:
def smethod():
print('This is a static method')
smethod=staticmethod(smethod)
def cmethod(cls):
print('This is a class method',cls)
cmethod=classmethod(cmethod)
或者:
# _*_ coding:utf-8 _*_
__metaclass__=type
class MyClass:
@staticmethod
def smethod():
print('This is a static method')
@classmethod
def cmethod(cls):
print('This is a class method',cls)
运算结果:
===========RESTART: C:\Users\Mr_Deng\Desktop\test.py===========
>>> MyClass.smethod()
This is a static method
>>> MyClass.cmethod()
This is a class method <class '__main__.MyClass'>
>>>
三、setattr、getattribute、setatr函数
__getattribute__(self,name):当特性为name被访问时自动被调用
__getattr__(self,name):当特性name被访问且对象没有想用的特性时被自动调用。
__setatr__(self,name,value):给特性那么赋值时自动调用。
__delattr__(self,name):删除name时自动调用。
案例如下:
# _*_ coding:utf-8 _*_
class AA:
def __init__(self):
self.w=0
self.h=0
def __setattr__(self,name,value):
if name=='test':
self.w,self.h=vaule
else:
self.__dict__[name]=value
def __getattr__(self,name):
if name=='test':
return self.w,self.h
else:
raise AttributeError