类和实例
属于类级别的变量,在使用时一定要带上类型名称,比如MyClass.count;
属于每个对象级别的变量,在调用时一定要带上self表明属于当前对象,比如self.name。
类和实例的使用
class MyClass: count = 0 name = "DefaultName" def __init__(self, name): self.name = name print("类的变量名是%s 对象的变量是%s" % (MyClass.name, self.name)) def setCount(self, count): self.count = count def getCount(self): return self.count if __name__ == "__main__": cls = MyClass("lisi") cls.setCount(20) print("count = %d" % cls.getCount())
__init__方法属于Python语言的构造函数,一个类只能有一个__init__方法,用于初始化类及其变量。
通过对象的setCount()、getCount()函数处理它的变量。
类的属性和方法
类的方法:在类的内部可以使用def关键字定义一个方法。与一般函数不同,类的方法必须包含参数self,且为第一个参数。
类的私有方法:在类的内部使用,命名格式为__private_method。私有方法以两个下划线开头,声明该方法为私有的,不能在类的外部调用,只能在类的内部调用,比如self.__private_methods。
类的私有属性:在类的内部使用,命名格式为__private_attrs。私有属性以两个下划线开头,声明该属性为私有的,不能在类的外部调用,只能在类内部的方法中使用,比如self.__private_attrs。
类的属性和方法的使用
class MyCounter: __secretCount = 0 # 私有变量 publicCount = 0 # 公共变量 def __privateCountFun(self): print("这是私有方法") self.__secretCount += 1 self.publicCount += 1 print(self.__secretCount) def publicCountFun(self): print("这是公共方法") self.__privateCountFun() if __name__ == "__main__": counter = MyCounter() counter.publicCountFun() counter.publicCountFun() print("instance publicCount=%d" % counter.publicCount) print("Class publicCount=%d" % MyCounter.publicCount)
从上面的代码可以看出:
可以在类的内部调用私有方法,不能在类的外部调用。
可以在类的内部访问私有属性,不能在类的外部访问。
对象属性类型的声明。
Python的一大特色就是无须声明类型变量,它会自动判断。
类的动态属性
如果不希望类的某属性被悄悄地访问、赋值或修改,希望在被访问、赋值或修改时能得到一些通知,那么可以使用函数property()。函数原型是:
property([fget[, fset[, fdel[, doc]]]])
它返回新式类(继承了object的类)的一个属性,其中fget是属性被访问时执行的方法,fset是属性被赋值时执行的方法,fdel是属性被删除时执行的方法。
下面代码定义了一个MyClass类,该类必须继承自object类,它有一个私有变量_param。
方法一:使用类的属性
class MyClass(object): def __init__(self): self._param = None def getParam(self): print("get param: %s" % self._param) return self._param def setParam(self, value): print("set param: %s" % self._param) self._param = value def delParam(self): print("del param: %s"% self._param) del self._param param = property(getParam, setParam, delParam) if __name__ == "__main__": cls = MyClass() cls.param = 10 print("current param: %s" % cls.param) del cls.param
在访问对象属性param时,对应执行了property(getx, setx, delx)所指定的方法而做了一些额外的事情
方法二:使用@property访问类的属性
同方法一,首先定义了一个MyClass类,该类必须继承自object类,它有一个私有变量_param。@property可以将Python定义的函数“当作”属性访问,从而提供更加友好的访问方式,但是有时候setter/getter也是需要的。
class MyClass(object): def __init__(self): self._param = None @property def param(self): print("get param: %s" % self._param) return self._param @param.setter def param(self, value): print("set param: %s" % self._param) self._param = value @param.deleter def param(self): print("del param: %s"% self._param) del self._param if __name__ == "__main__": cls = MyClass() cls.param = 10 print("current param: %s" % cls.param) del cls.param
方法二的效果同方法一,但是方法二更加灵活、简单,在开发中经常使用。