一. 元类
1.类是一组用来描述如何生成一个对象的代码段。在python中 , 类也是一个对象。当使用class 关键字创建类的时候, python 解释器在执行的时候会创建一个对象 。 (python中一切皆对象)
2. 类的本质是对象,那么我们就可以对类进行:
1)可以将类赋给一个变量
2) 可以拷贝一个类
3) 可以给类增加属性
4) 可以将类作为函数的参数进行传递
3. 动态创建类
ps: 静态语言: 只能先编译,然后再运行
动态语言: 可以边编译,边运行
def choose_class(name):
if name == 'foo'
class = Foo(object)
pass
return Foo #此处返回的是类,而不是类实例化出来的对象
else:
class Bar(object):
pass
return Bar
- type
1)type 是元类 ----- >
class Date(object):
pass
print(Date.__ class __)
运行结果为: <class ' type' >
- type 可以查看类的方法(eg . type(2))
- type 方法: 动态创建类
__ metaclass __ —> 可以自定义指定的元类
eg:
运行结果为:
4) 动态创建元类的方法 (基于元类的创建)
#创建一个自己的学生系统
MathStudent = type('MathStudent', (object, ), {'country': 'china'})
print(MathStudent)
print(MathStudent.__bases__)
print(MathStudent.__dict__)
print(MathStudent.country)
运行结果为:
5) 动态添加属性
eg.
#为Date 添加一个show 方法
def show():
print('show time ')
Date = type('Date', (), {'show': show})
Date.show()
运行结果为:
二. 动态语言
- 定义: 动态编程语言是高级程序设计语言的一个类别,在计算机科学领域已经被广泛应用,它是一类在运行时可以改变其结构的语言, eg . 新的函数,对象。。。
python也是一个动态语言
自省功能
hasattr() --> 判断类里面是否具有指定的属性
getattr() —> 获取类里面的指定属性对应的内容
setattr() ----> 设置类里面的属性 eg setattr(Prettyable , ‘a’ , 1)
delattr () ---->删除类里面的属性
eg.
from prettytable import PrettyTable
# 自省功能
# 判断;类里面是否包含指定的属性?
print(hasattr(PrettyTable, '__doc__'))
print(hasattr(PrettyTable, 'a'))
# 获取指定属性对应的内容;
print(getattr(PrettyTable, "__bases__"))
# print(getattr(PrettyTable, "a"))
# 设置指定的属性, 动态添加属性信息的
setattr(PrettyTable, 'a', 1)
print(getattr(PrettyTable, 'a'))
@staticmethod
def test():
print("这是一个测试方法")
if hasattr(PrettyTable, 'test'):
print(getattr(PrettyTable, 'test'))
else:
print("正在动态添加方法:")
setattr(PrettyTable, 'test', test)
print(getattr(PrettyTable, 'test'))
test = getattr(PrettyTable, 'test') # 返回的时函数名
test()
print(hasattr(PrettyTable, 'a'))
print("正在删除属性")
delattr(PrettyTable, 'a')
print(hasattr(PrettyTable, 'a'))
__ slots __ : 在python 中用来限制class 类里面实例能添加的属性
ps : 动态语言: 可以在运行的过程中修改代码
静态语言: 编译的时候已经确定好代码了,在运行的过程中不能修改
注: __slots __ : 定义的属性进对当前类实例起作用,对继承的子类不起作用
eg.
from collections import Counter
class MyCounter(object):
# 限制属性的添加, 只能添加count和age;
__slots__ = ('count', 'a')
print(hasattr(MyCounter, 'a'))
counter = MyCounter()
counter.a = 1
print(counter.a)
运行结果为:
练习1:创建一个学生管理系统,信息包括:学号,姓名,年龄,性别,出生日期,邮箱, 主要的功能有: 学生信息的录入,学生信息的总览,学生信息的查看(用学号查看,或者用姓名查看),学生信息的修改,学生信息的删除
实验代码如下:
"""
学生信息包括学号, 姓名,年龄,性别,出生年月日,地址,电话, e-mail 等
1. 系统以菜单的方式显示
2. 学生信息录入系统 ---- 输入
3. 学生信息浏览系统 ---- 输出
4. 查询功能: 1) 按照学号查找 2) 按照姓名查找
5. 学生信息的修改与删除
"""
class Student(object):
dic = {}
def __init__(self, cor, name, age, grande, birth, address, mail):
self.cor = cor
self.name = name
self.age = age
self.grande = grande
self.birth = birth
self.address = address
self.mail = mail
def __str__(self):
return '<学生 %s >' % (self.name)
class StudentManger(object):
studentInfos = []
global cor
global name
global age
global grande
global birth
global address
global mail
def __iter__(self):
return (studentInfo.name for studentInfo in self.studentInfos)
def init(self):
# 初始化信息,并且添加信息
cor = input("请输入要添加的学号:")
name = input("请输入需要添加的姓名:")
age = input("请输入需要添加的年龄")
grande = input("请输入需要添加的性别")
birth = input("请输入需要添加的出生日期")
mail = input("请输入需要添加的邮箱(e-mail)")
self.studentInfos.append((cor, name, age, grande, birth, mail))
def find1(self):
findinfo = input("请输入需要查找的学号:")
if findinfo == self.studentInfos[0]:
print("该学生的信息为:学号:%s\n,姓名:%s\n,年龄:%s\n,性别:%s\n, 出生日期:%s\n, 邮件:%s\n")
else:
print("没有该学生信息,请检查输入是否正确")
def find2(self):
findinfo = input("请输入需要查找的姓名:")
if findinfo == self.studentInfos[1]:
print("该学生的信息为:学号:%s\n,姓名:%s\n,年龄:%s\n,性别:%s\n, 出生日期:%s\n, 邮件:%s\n")
else:
print("没有该学生信息,请检查输入是否正确")
def show(self):
for cor in students :
print(""" 学生信息系统
学号 : %s
姓名:%s
年龄: %s
性别:%s
出生日期:%s
邮件:%s
""" % (cor, name, age, grande, birth, mail))
def update(self):
updateinfo = input("请输入需要修改信息的学号:")
self.init()
if updateinfo in self.studentInfos[0]:
= Student(cor ,name,age,grande ,birth, mail)
print("修改信息成功")
else:
print("该学生信息不存在,请查看输入是否正确")
def delinfo(self):
delinfo = input("请输入需要删除信息的学号:")
self.init()
if delinfo in studentInfos:
del studentInfos[delinfo]
print("删除学生信息成功")
else:
print("该学生的信息不存在,请查看输入是否正确")
def menu(self):
print(""" 学生信息管理系统
请选择需要进行的操作:
1 学生信息录入
2. 学生信息浏览
3. 查询功能 : 按照学号查找
4. 查询功能: 按照姓名查找
5. 学生信息的修改
6. 学生信息的删除
""")
students = {}
student = StudentManger()
student.menu()
while True:
choice = int(input("请选择功能:"))
if choice == 1:
student.init()
elif choice == 2:
student.show()
elif choice == 3:
student.find1()
elif choice == 4:
student.find2()
elif choice == 5:
student.update()
elif choice == 6:
student.delinfo()
else:
print("您输入有误,请重新输入")