python反射与@property

Python 2018-11-17 1007

class Teacher:    
    dic = {"查看学生信息": '', '查看讲师信息': ''}    
    def show_student(self):    
        print('show_student')

    def show_teacher(self):    
        print('show_teacher')    
    @classmethod    
    def func(cls):    
        print('dddd')    
# hasattr getattr delattr    
# getattr(对象名, 字符串)    
# python中一切皆对象    

ret = getattr(Teacher, 'dic')  # 类的属性    
print(ret)    
ret2 = getattr(Teacher, 'func')  # 类的方法    
ret2()    

# 如果有才执行    
if hasattr(Teacher, 'dic2'):    
    getattr(Teacher, 'dic2')    
test = Teacher()    
ret3 = getattr(test, 'show_student')    
ret3()    
# 对象名 获取对象属性和 普通方法    
# 类名 获取静态属性 和类方法 和静态方法    


# property    
# 内置装饰器函数 只在面向对象中使用    
# 将方法伪装成一个属性    
from math import pi    
class Circle:    
    def __init__(self, r):    
        self.r = r    

    @property    
    def perimeter(self):    
        return 2*pi*self.r    

    @property    
    def area(self):    
        return self.r**2*pi    


c1 = Circle(5)    
print(c1.area)  # 圆的面积    
class Person:    
    def __init__(self, name):    
        self.__name = name    

    @property    
    def name(self):    
        return self.__name    

    # 修改属性, 方法名要相同    
    @name.setter    
    def name(self, new_name):    
        self.__name = new_name    


a = Person('aaa')    
print(a.name)    
a.name = 'bbbbb'    
print(a.name)  

getattr()的作用是获取实例的属性值(__init__下的属性,类属性,使用@property装饰的方法)
setattr()的作用就是修改实例的属性值(不包含装饰的方法),若属性不存在,就是创建新属性。

标签:Python

文章评论

评论列表

已有0条评论