019-2018-09-28 反射

1.今日内容大纲

一. 昨日内容回顾
    1. 关系
        1. 依赖关系. 在方法中传递参数.
        2. 关联关系. self.xxx = xxxx
        3. 继承关系. self是什么?  当前正在执行方法的对象
        4. 特殊成员:
            __init__()
            __new__()
            __getitem__()  obj[xxx]
            __setitem__() obj[xxx] = xxxx
            __delitem__() del obj[xxx]
            __call__() obj()
            __str__()  print(obj)   返回这个对象的字符串表示形式
            __enter__()
            __exit__()  with

二. 作业讲解

三. 今日主要内容
    1. issubclass, type, isinstance
        issubclass 判断xxxx类是否是xxxx类的子类
        type 给出xxx的数据类型. 给出创建这个对象的类
        isinstance 判断xxx对象是否是xxx类型的


    2. 如何分辨方法和函数.
        在外面定义的函数一定是函数
        在类中:
            1. 实例方法: 如果是对象访问.方法,, 如果是类名访问是函数
            2. 静态方法: 都是函数
            3. 类方法: 都是方法
        如果想要用程序来判断. 需要引入两个模块
        from types import FunctionType, MethodType
        isinstance()

    3. 反射(重点)
        仅限于内存层面
        重点:
        hasattr(obj, str) 判断对象中是否包含了xxx(str)
        getattr(obj, str) 从对象中获取xxxx(str)
        次重点:
        setattr(obj, str, value) 给对象设置xxxx(str)属性值(value)
        delattr(obj, str) 从对象中删除xxxxx(str)信息

2.练习

# class UserInfo(object):
#     pass
#
# class Department(object):
#     pass
#
# class StarkConfig(object):
#     def __init__(self, num):
#         self.num = num
#
#     def changelist(self, request):
#         print(self.num, request)
#
#     def run(self):
#         self.changelist(999)
#
# class RoleConfig(StarkConfig):
#
#         def changelist(self, request):
#             print(666, self.num)
#
# class AdminSite(object):
#         def __init__(self):
#             self._registry = {}
#         def register(self, k, v): # k:UserInfo,  v:StarkConfig
#             self._registry[k] = v(k)
#
# # site = AdminSite()
# # site.register(UserInfo, StarkConfig) # {UserInfo:StarkConfig(Userinfo)}
# # site.register(Department, RoleConfig) # {UserInfo:StarkConfig(Userinfo), Department:RoleConfig(Department)}
# #
# # for k, row in site._registry.items():
# #     row.run()


class UserInfo(object):
    pass


class Department(object):
    pass


class StarkConfig(object):

    def __init__(self, num):
        self.num = num

    def get_vals(self):
        v = [11, 22, 33]
        extra = self.extra_vals()
        if extra:
            v.extend(extra)
        return v

    def extra_vals(self):
        pass

    def run(self):
        return self.get_vals()


class RoleConfig(StarkConfig):

    def extra_vals(self):
        return [99, 88]


class AdminSite(object):
    def __init__(self):
        self._registry = {}

    def register(self, k, v):
        self._registry[k] = v(k)


site = AdminSite()
site.register(UserInfo, StarkConfig)
site.register(Department, RoleConfig)  # {UserInfo:StarkConfig(Userinfo), Department:RoleConfig(Department)}
for k, row in site._registry.items():
    print(row.run())
# StarkConfig(Userinfo).run()
# RoleConfig(Department).run()

3.补充练习2

class User:
    def __init__(self, id, nick_name, login_name, login_psw, real_name, card, phone, address, email):
        self.id = id
        self.nick_name = nick_name
        self.login_name = login_name
        self.login_psw = login_psw
        self.real_name = real_name
        self.card = card
        self.phone = phone
        self.address = address
        self.email = email
        self.order_list = []



class Order:
    #  订单编号, 流⽔号, 所属⽤户编号, 收货地址. 邮费. 订单状态(0:发货, 1:收货, 2: 退货), 评价编号.
    def __init__(self, id, liushui,  address, user, pingjia, youfei=0.00, order_status=0):
        self.order_detail_list = []
        pass

# 信息: 评价编号, 评价分数, 评价内容, 评价显⽰(0:显⽰, 1:不显⽰), 评价
# 类型(1: 物流评价, 2: 服务评价, 3: 商品评价)
class PingJia:
    def __init__(self, id, score, content, pingjia_status, isShow=0):
        pass

# 明细编号, ⼩流⽔号, 商品购买时价格, 购买数量. 商品编号
class OrderDetail:
    def __init__(self, id, xiaoliushui, price, num, product, order):
        pass

# 商品编号, 商品名称, 商品描述, 商品价格, 商品库存
class Product:
    def __init__(self, id, name, desc, price, store):
        pass


4.补充练习1


from random import randint

class Stu:

    def __init__(self, num, name, address):
        self.num = num
        self.name = name
        self.address = address
        self.course_list = []

    def add_course(self, course):
        self.course_list.append(course)

    def show(self):
        print("学生姓名:%s" % self.name)
        for c in self.course_list:
            print("选的课程是:%s" % c.name)
            if c.teacher:
                print("授课老师的电话:%s" % (c.teacher.tel))
            else:
                print("该课程还没有老师")

    def check(self):
        # 1.显示所有课程.
        # 2.选课
        # 3.添加到列表中
        pass

class Course:

    def __init__(self, num, name, teacher=None):
        # if teacher != None and isinstance(teacher, Teacher):
            self.num = num
            self.name = name
            self.teacher = teacher
        # else:
        #     raise Exception()

    def set_teacher(self, teacher):
        self.teacher = teacher

    def show(self):
        if self.teacher:
            print("课程的名称是:%s, 授课老师是:%s" % (self.name, self.teacher.name))
        else:
            print("课程的名称是:%s, 授课老师是:%s" % (self.name, "无"))

class Teacher(object):

    def __init__(self, id, name, tel):
        self.id = id
        self.name = name
        self.tel = tel



c1 = Course(1, "体育课")
c2 = Course(2, "生物课")
c3 = Course(3, "历史课")
c4 = Course(4, "思想品德课")
c5 = Course(5, "电子竞技课")
c6 = Course(6, "python课")

t1 = Teacher(1, "周杰伦", 11111)
t2 = Teacher(2, "彭于晏", 11112)
t3 = Teacher(3, "林更新", 11113)
t4 = Teacher(4, "吴彦祖", 11114)
t5 = Teacher(5, "周星驰", 11115)
t6 = Teacher(6, "alex", 11116)

c1.set_teacher(t1)
c2.set_teacher(t2)
c3.set_teacher(t3)
c4.set_teacher(t4)
c5.set_teacher(t5)
c6.set_teacher(t6)

c_lst = [c1, c2, c3, c4, c5, c6]

stu_lst = []

for i in range(30):
    stu = Stu(i,"Stu%s" % i,"美丽富饶的沙河")

    s = set()
    while len(s) < 3:
        s.add(randint(0, 5))
    for index in s:
        stu.add_course(c_lst[index]) # 你选的课

    stu_lst.append(stu)

for stu in stu_lst:
    stu.show()

5.issubclass

class Animal:
    pass

class Cat(Animal):
    pass

class BoSiCat(Cat):
    pass


print(issubclass(Cat, Animal)) # 判断第一个参数是否是第二个参数的后代
print(issubclass(Animal, Cat))
print(issubclass(BoSiCat, Animal)) # True

6.type

# class Animal:
#     pass
#
# class Cat(Animal):
#     pass
#
# class BoSiCat(Cat):
#     pass
#
# c = Cat()
# print(type(c)) # 比较精准的给出对象的类

# 计算a+b的结果并返回. 两个数相加
# def add(a, b):
#     if (type(a) == int or type(a) == float) and (type(b) == int or type(b) == float):
#         return a + b
#     else:
#         print("算不了")
#
# print(add("胡汉三", 2.5))


7.isinstance

class Animal:
    pass

class Cat(Animal):
    pass

class BoSiCat(Cat):
    pass

# a = Animal()
# print(isinstance(a, Animal)) # 自己类可以判断
# print(isinstance(a, Cat))   # 子类不能判断



c = BoSiCat()
print(isinstance(c, Animal)) # True  子类的对象可以当成父类的类型来看.
# isinstance判断的是对象是否是xxx家族体系的内容. 往上找




lst = "马化腾"
print(type(lst.__iter__()))

8.方法和函数


def func():
    print("我是func")

print(func) # <function func at 0x00000253260678C8>

class Foo:
    # 实例方法: 对象.方法  方法    类名.方法  函数
    def chi(self):
        print("我是吃")

    @staticmethod # 都是函数
    def static_method():
        pass

    @classmethod # 都是方法
    def class_method(cls): # 类对象的内容
        pass
    @property # 神马都不是. 变量
    def age(self):
        return 10

# 引入两个模块
from types import FunctionType, MethodType

def haha(arg):
    print(isinstance(arg, FunctionType)) # False
    print(isinstance(arg, MethodType)) # True
haha(Foo.age)


# f = Foo()
# print(f.chi) # <bound method Foo.chi of <__main__.Foo object at 0x0000022D69C48390>>
# Foo.chi(f)
# print(Foo.chi) # <function Foo.chi at 0x000001A4BBEE79D8>
#
# print(f.static_method) # <function Foo.static_method at 0x000002BBD2DB7A60>
# print(Foo.static_method) # <function Foo.static_method at 0x00000233E2247A60>
#
# print(f.class_method) # <bound method Foo.class_method of <class '__main__.Foo'>>
# print(Foo.class_method) # <bound method Foo.class_method of <class '__main__.Foo'>>

9.面向对象的反射


class Person:
    def __init__(self, name):
        self.name = name
        self.age = None

    def chi(self):
        print("人喜欢吃东西%s" % self.name)

p = Person("刘伟")
setattr(p, "name", "大阳哥") # 动态的给对象设置属性和值
setattr(p, "age", 18) # 很少用. 慎用

print(p.age)
delattr(p, "age")
print(p.age)

# p.chi()

# val = input("请输入你想让刘伟执行的动作:")
# if hasattr(p, val):
#     getattr(p, "name")
#     func = getattr(p, val)
#     func()


10.其他

master.py

def chi():
    print("大牛一顿吃100碗饭")

def he():
    print("大牛一顿喝一桶")

def la():
    print("大牛很能拉")

def shui():
    print("大牛一次睡一年")

name = "大牛"

test.py

import master

# while 1:
#     print("""大牛写了很多的功能:
#     chi
#     he
#     la
#     shui
# """)
#     val = input("请输入你要测试的功能") # he
#
#     if hasattr(master, val):
#         attr = getattr(master, val) # 从xxx对象或者模块中找xxxxx(字符串) 功能, 变量
#         if callable(attr): # 判断这个鬼东西是否可以被调用
#             attr()
#         else:
#             print(attr)
#     else:
#         print("没有这个功能")
#
#     # master.val()
#     #
#     # master."chi"()
#
#
#     # if val == 'chi':
#     #     master.chi()
#     # elif val == "he":
#     #     master.he()
#     # elif val == "la":
#     #     master.la()
#     # elif val == "shui":
#     #     master.shui()
#     # else:
#     #     print("滚犊子")
#

# 把chi函数换成lambda
# print(master.chi)
# setattr(master, "chi", lambda x: x + 1)
# print(master.chi)

delattr(master, "la") # 删除xxx
master.la()

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值