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()