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()