OOP-成员描述符

  • 很多时候,我们并不想用户直接修改类属性,而是通过特有的方法,来访问和修改类属性
  • 类的成员描述符使为了类中对类的成员属性进行相关操作的一种方式(get, set, delete)
  • 如果使用类的成员描述符有三种方法:1. 使用类实现描述器, 2. 使用属性修饰器, 3. 使用property

对类属性进行大写操作

class studint1():
    def __init__(self,name,age):
        self.age = age
        self.set_name(name) # 自己调用自己的函数进行一些操作
    def info(self):
        print('hi i am {0},age{1}'.format(self.name,self.age))
    def set_name(self, name): #传进来一个name参数 使其self.name大写操作
        self.name = name.upper()



xiaoming = studint1('xiaoMING',19)
huahua = studint1('huahua',20)
xiaoming.info()
huahua.info()

使用property obj = property(func读取,func赋值,func删除,'doc文档')

class studint2():
    #函数的名称可以任意
    def __init__(self):
        self.name = '哈哈哈'
    def fget(self): #此函数是对成员进行读取时执行的代码
        print('我是name被读取了')
        return self.names
    def fset(self,nam):#此函数时对成员进行赋值修改的时候执行的操作   
                       #注意传入进来的参数 不能和propert的obj相同 否则无限循环

        self.names = nam.upper() #对name大写操作
    def fdel(self): #删除成员的时候进行的操作
        self.names = 'NoName'
    #下面是对age的操作
    def Nget(self):
        print('我是age被读取了')
        return(self.ages)
    def Nset(self,age):
        self.ages = int(age)
    def Ndel(self):
        self.ages = 'NoAge'

    name = property(fget,fset,fdel,'对name的操作')
    age = property(Nget,Nset,Ndel,'对age的操作')

s1 = studint2()      #创建实例
print(s1.name)       #这里还没进行修改 还是实例化后init中的'哈哈哈'
s1.name = 'xiaoming' #使实例创建name属性时自动调用fset方法
                     # 把name传进函数中转为大写赋值给self.names
print(s1.name)       #自动调用property对name进行了进行fget操作返回了设置的fget,的参数self.names
s1.age = 20.00
print(s1.age,type(s1.age))