面向对象:类中的反射及其应用

# 什么是反射?
  # 用字符串数据类型的变量名来访问这个变量的值
  # 反射的方法: getattr hasattr setattr delattr

#引,当你没用反射时是这样的!
class Student:
    def __init__(self,name):
        self.name = name
    def check_course(self):
        print('check_course')
    def choose_course(self):
        print('choose_course')
    def choosed_course(self):
        print('查看已选择的课程')
stu = Student('tianba')
num = input('>>>')
if num == 'check_course':
    stu.check_course()
elif num == 'choose_course':
    stu.choose_course()
elif num == 'choosed_course':
    stu.choosed_course()

#执行结果:
>>>check_course
check_course

# 类 静态属性 类方法 静态方法

  # 命名空间.XXX == getattr(命名空间,'XXX')
class Student:
    ROLE = 'STUDENT'
    @classmethod
    def check_course(cls):
        print('查看课程了')

    @staticmethod
    def login():
        print('登录')
# 反射查看属性
print(Student.ROLE)
print(getattr(Student,'ROLE')) #第一个参数的命名空间中的变量名为第二个参数的变量的值
            #命名空间   #变量的值

# 反射调用方法
getattr(Student,'check_course')()  # 类方法
getattr(Student,'login')()         # 静态方法

num = input('>>>') #输入内容调用静态方法
if hasattr(Student,num):
    getattr(Student,num)()
#执行结果:
STUDENT
STUDENT
查看课程了
登录
>>>login
登录
# 反射调用方法
  # getattr(Student,'check_course')() # 类方法
  #getattr(Student,'login')() # 静态方法

# num = input('>>>') #让用户输入内容调用静态方法
# if hasattr(Student,num):
# getattr(Student,num)()

# 对象

  # 方法 对象属性
class A():
    def __init__(self,name):
        self.name = name

    def func(self):
        print('in func')

a = A('alex')
print(a.name)
print(getattr(a,'name')) #一个参数为对象,第二个参数为对象的属性
getattr(a,'func')() #使用对象去反射类的方法和对象的属性

#执行结果:
alex
alex
in func

# 总结反射

  # hasattr,getattr
# 类名.名字
# getattr(类名,'名字')
# 对象名.名字
# getattr(对象,'名字')
# 模块名.名字
# import 模块
# getattr(模块,'名字')
# 自己文件.名字
# import sys
# getattr(sys.modules['__main__'],'名字')

# 选课系统的代码
# login
# 判断身份 并且根据身份实例化
# 根据每个身份对应的类 让用户选择能够做的事情
class Manager:
OPERATE_DIC = [
('创造学生账号', 'create_student'),
('创建课程','create_course'),
('查看学生信息','check_student_info'),
]
def __init__(self,name):
self.name = name
def create_student(self):
print('创建学生账号')
def create_course(self):
print('创建课程')
def check_student_info(self):
print('查看学生信息')

class Student:
OPERATE_DIC = [
('查看所有课程', 'check_course'),
('选择课程', 'choose_course'),
('查看已选择的课程', 'choosed_course')
]
def __init__(self,name):
self.name = name
def check_course(self):
print('check_course')
def choose_course(self):
print('choose_course')
def choosed_course(self):
print('查看已选择的课程')

def login():
username = input('user : ')
password = input('pwd : ')
with open('userinfo') as f:
for line in f:
user,pwd,ident = line.strip().split('|') # ident = 'Manager'
if user == username and pwd == password:
print('登录成功')
return username,ident

import sys
def main():
usr,id = login()
print('user,id :',usr,id)
file = sys.modules['__main__']
cls = getattr(file,id) #Manager = getattr(当前文件,'Manager')
obj = cls(usr)
operate_dic = cls.OPERATE_DIC
while True:
for num,i in enumerate(operate_dic,1):
print(num,i[0])
choice = int(input('num >>>'))
choice_item = operate_dic[choice-1]
getattr(obj,choice_item[1])()
main()
# l = ['a','b','c']
# for num,i in enumerate(l,1):
# print(num,i)

# class A:
# def __init__(self,name):
# self.name = name
#
# a = A('alex')

# # a.name = 'alex_SB'
# # getattr(a,'name')
# setattr(a,'name','alex_SB')
# print(a.name)
# print(a.__dict__)
# del a.name
# print(a.__dict__)
# delattr(a,'name')
# print(a.__dict__)









猜你喜欢

转载自www.cnblogs.com/skydragon/p/11681518.html