python中的@property
使用@property装饰器的好处是既可以保护类的封装性,又可以使用“类.属性”来对私有属性进行操作。
使用@property装饰器可以直接通过方法名来访问方法,不需要再在后面使用"()".
class pandas(object): def __init__(self,age): self.__age=age def __str__(self): return("panda's age:"+str(self.__age)) @property #直接通过方法名访问age方法,但是这只能对age读操作 def age(self): return(self.__age) @age.setter #可以直接通过该方法对类中的私有变量的值进行修改 def age(self,value): self.__age=value @age.deleter #可以直接通过该方法直接删除私有变量的值 def age(self): self.__age=0 p=pandas(3) print(p.age) #直接通过方法名访问age方法,但是这只能对age读操作 print(p) p.age=4 print(p) del p.age print(p)
上面的例子分别展示了:
- 使用@property 直接调用 age() 方法,这样就使得该方法变成了 age 属性的 getter 方法,也就是读操作
- setter 装饰器:@age.setter,可以对私有属性age的值进行写操作
- deleter 装饰器: @age.deleter,可以对私有属性age的值进行删除操作
注1:另外,私有属性只能在类中使用,且不可访问,目的是保护数据的安全性,以及隐藏核心开发细节。私有属性或私有方法以两个下划线开头。
注2:面向对象有三大特性: 封装,继承,多态
- 父类的私有方法和私有属性,不会被子类继承
- 可以通过调用继承的父类的共有方法,间接的访问父类的私有方法、属性
- python中用super来使子类继承父类的属性或方法
class animal(object): def __init__(self,name,age): self.name=name self.age=age def __str__(self): #当print(类)时,自动返回该模块 return("name:"+str(self.name)+",age:"+str(self.age)) def climb(self): print(str(self.name)+" can climb the tree.") def eat(self): print(str(self.name)+" eats three times a day.") class panda(animal): def __init__(self,name,age):#创建类之后,自动调用该模块对类中的属性进行初始化 super(panda,self).__init__(name,age) def climb(self): #重写父类的climb方法 print(str(self.name)+" can climb the tree rapidly.") #若父类的name属性是私有属性,这里就无法访问 if __name__=="__main__": p=animal("Mary",2) print(p) p.climb() p1=panda("Mary",3) print(p1) p1.eat() p1.climb()