1 类和实例

类和实例

属于类级别的变量,在使用时一定要带上类型名称,比如MyClass.count;

属于每个对象级别的变量,在调用时一定要带上self表明属于当前对象,比如self.name。

类和实例的使用

class MyClass:
    count = 0
    name = "DefaultName"
    
    def __init__(self, name):
        self.name = name
        print("类的变量名是%s\n对象的变量是%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

方法二的效果同方法一,但是方法二更加灵活、简单,在开发中经常使用。

posted @ 2020-07-29 14:33  Laney_Sun  阅读(125)  评论(0编辑  收藏  举报