面向对象进阶

一. 元类
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 
  1. type
    1)type 是元类 ----- >
 class Date(object):
              pass
    print(Date.__ class __)

 运行结果为:   <class ' type' >
  1. type 可以查看类的方法(eg . type(2))
  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()

运行结果为:

在这里插入图片描述

二. 动态语言

  1. 定义: 动态编程语言是高级程序设计语言的一个类别,在计算机科学领域已经被广泛应用,它是一类在运行时可以改变其结构的语言, 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("您输入有误,请重新输入")
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值