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

 

posted @ 2021-10-10 11:47  八戒不爱吃西瓜  阅读(121)  评论(0编辑  收藏  举报