面向对象:属性-装饰器函数@property

# 属性的初识
  属性: 装饰器函数,内置函数,帮助你将类种的方法伪装成属性,特性。代码上没有什么提升,只是更合理.
    
    @property 调用方法的时候不需要主动加括号,让程序的逻辑性更合理.

    @属性名.setter 装饰器,修改被property装饰的属性的时候会调用被这个装饰器装饰的方法,除了self之外还有一个参数,被修改的值
    @属性名.deleter 装饰器,当要删除被property装饰的属性的时候会调用这个被这个装饰器装饰的方法
class Person:

    def __init__(self,name,hight,weight):
        self.name = name
        self.__hight = hight
        self.__weight = weight

    @property
    def bmi(self):
        return '%s 的bmi 值%s' %(self.name,self.__weight / self.__hight ** 2)

p1 = Person('大阳哥',1.68,70)
# print(p1.bmi())
print(p1.bmi)
# 属性  : 将一个方法  伪装成一个 属性,在代码的级别上没有本质的提升,但是让其看起来跟合理.
print(p1.name)
p1.name = 'alex'
print(p1.name)
# 属性的改
class Person:
    def __init__(self,name,age):
        self.name = name
        if type(age) is int:
            self.__age = age
        else:
            print( '你输入的年龄的类型有误,请输入数字')
    @property
    def age(self):
        return self.__age

    @age.setter
    def age(self,a1):
        '''判断,你修改的年龄必须是数字'''
        if type(a1) is int:
            self.__age = a1
        else:
            print('你输入的年龄的类型有误,请输入数字')

    @age.deleter
    def age(self):
        del self.__age

p1 = Person('帅哥',20)
print(p1.age)
print(p1.__dict__)
p1.age = 23
print(p1.age)
del p1.age
print(p1.__dict__)

20
{'name': '帅哥', '_Person__age': 20}
23
{'name': '帅哥'}

# property : 类似于bmi这种,area,周长....  ***
# @age.setter **
# @age.deleter *
待整理:
# property 装饰器函数,内置函数,帮助你将类中的方法伪装成属性,特性
# 调用方法的时候不需要主动加括号
# 让程序的逻辑性更合理
# @方法名.setter 装饰器,修改被property装饰的属性的时候会调用被这个装饰器装饰的方法,除了self之外还有一个参数,被修改的值
# @方法名.deleter 装饰器,当要删除被property装饰的属性的时候会调用被这个装饰器装饰的方法

# 只用property
# class Circle:
# def __init__(self,r):
# self.r = r
# # self.area = 3.14*self.r**2
#
# @property
# def area(self): # 这个方法计算结果本身就是是一个属性,但是这个属性会随着这个类/对象的一些基础变量的变化而变化
# return 3.14*self.r**2

# c = Circle(5)
# print(c.area)
# c.r = 10
# print(c.area)

# 偏其他语言 property+私有的 合用 ,这个时候更多的也会用到setter和deleter
# class A:
# def __init__(self,name):
# self.__name = name
#
# @property
# def name(self):
# return self.__name
#
# @name.setter
# def name(self,new_name):
# if type(new_name) is str:
# self.__name = new_name
#
# @name.deleter
# def name(self):
# del self.__name
# a = A('alex')
# a.name = 123
# print(a.name)
# del a.name # 语法
# print(a.name)
 
posted @ 2019-10-14 22:56  DragonSKY  阅读(220)  评论(0)    收藏  举报