learn_Day14 内置函数补充、反射、初识面向对象
内置函数
- __import__()用于导入模块
- getattr 用于寻找模块的指定对象
- a = __import__(‘b’) # b为模块名,b是字符串 ==>> 导入模块b并重新命名为a
- c = getattr(a,’d’) # d为模块中指定对象 ==>> 找到模块中命名为d的对象
- d() ==>> 执行d
# getattr(a,’b’, c) # 从a模块中导入b。c参数可不写表示找不到报错;c为None表示找不到不报错,返回None。 # hasattr(a,’b’) # 判断a中b模块是否存在。 # setattr(a,’b’, c) # 在内存中我模块a创建b=c。 # delattr(a,’b’) # 在内存中删除模块a中的b。
反射
定义:根据字符串去某个对象中去操作其成员
- 通过字符串形式导入模块
- 通过字符串形式去模块中寻找并执行

例1:导入lib/account中的a并执行
# /usr/local/bin/python # -*- coding: utf-8 -*- # Author: Ren Hang def login(): return "login" def logout(): return "logout" def nb(): return "niu"

例2:模拟web框架
# 模拟web框架
from lib.account import a
url = input("shuru:")
inp = url.split('/')[-1]
if hasattr(a, inp):
target_func = getattr(a, inp)
r = target_func()
print(r)
else:
print("404")
初识面向对象
- # 面向对象:不是所有的情况都适用
- # c#、java只能用面向对象进行编程,Python即可以用函数编程也可以用面向对象编程
- # 函数编程比较繁琐,面向对象比较方便
-
# 面向对象编程过程 # 创建类(用于封装函数) class xxx: def f1(self): print("f1") def f2(self): print("f2") def f3(self): print("f3") def f4(self): print("f4") # 根据类创建对象,使用对象去执行类中的方法 a = xxx() b = a.f1()
封装的应用场景:
1.当同一类型的方法具有相同的参数时直接封装到对象即可
2.以类当做模板,创建多个对象,对象可以封装不同的数据
# 方法1
方法2
# 方法1 class ooo: def o1(self): print(self.b1) def o2(self): print(self.b1) obj1 = ooo() # 创建对象 obj1.b1 = "abc" # 在对象中封装数据 obj1.o1() # 执行类的方法,在执行过程中可以根据self去obj1中去提取封装里面的数据 obj2 = ooo() obj2.b1 = "xxx" obj2.o2()
# 方法2:__init__构造方法 # 通过对象直接调用 class Foo: def __init__(self, name, age): self.name = name self.age = age obj1 = Foo("ooo", 18) print(obj1.name, obj1.age) obj2 = Foo("xxx", 19) print(obj2.name, obj2.age) # 通过self间接调用 class Foo: def __init__(self, name, age): self.n = name self.a = age def fo(self): print(self.n) print(self.a) obj1 = Foo("ooo", 18) obj1.fo() obj2 = Foo("xxx", 19) obj2.fo()
继承:
1.派生类可以继承基类的所有东西,如果基类与派生类同时存在这个东西,优先派生类
2.在Python中一个派生类可以继承多个基类,其他语言中只能继承一个基类
3.派生类在继承多个基类时,按照指定循序寻找,如图所示:
注:蓝色箭头为继承循序,红色箭头为继承关系
# 继承
# 继承 class Animals: # 基类 def chi(self): print("吃") def he(self): print("喝") class Dog(Animals): # 派生类 def __init__(self, name): self.na = name def jiao(self): print(self.na + "wang") a = Dog("wangwnag") # 创建派生类对象 a.chi() # 执行基类方法 a.he() a.jiao()

多态:多种形态。Python本身支持多态
class Foo:
def f1(self):
print("Foo")
class Bar:
def f1(self):
print("Bar")
def func(arg):
arg.f1()
func(Foo())
func(Bar())
扩展(其他语言):
-重载:函数名相同,参数个数不同
-重写:在派生类中重新实现基类中的方法
-接口:Java、c#等其他语言(首字母为I),在Python中默认不存在,用于约束,不能实现任何功能,如果派生类继承接口则派生类必须实现接口内的每一个功能
练习
# /usr/local/bin/python
# -*- coding: utf-8 -*-
# Author: Ren Hang
"""
会员信息
会员A: 会员号:HY0001,积分:3
会员B: 会员号:HY0002,积分:5
会员C: 会员号:HY0003,积分:10
购买一次商品 + 1 分,退一次商品 - 1 分
"""
class Member:
"""Name:姓名, MemberNo:会员号, Integral:积分"""
def __init__(self, Name, MemberNo, Integral):
self.name = Name
self.no = MemberNo
self.integral = Integral
def buy(self):
"""注释:购买商品"""
self.integral = self.integral + 1
def retreat(self):
"""注释:退货"""
self.integral = self.integral - 1
def detail(self):
"""注释:会员的详细信息"""
temp = "姓名:%s ; 会员号:%s ; 积分:%s" % (self.name, self.no, self.integral)
print(temp)
# 员工信息
HYA = Member('Aa', "HY0001", 3) # 创建苍井井角色
HYB = Member('B', "HY0002", 5) # 创建东尼木木角色
HYC = Member('C', "HY0003", 10) # 创建波多多角色
# 输出原始信息
print("原始信息".center(30, "-"))
HYA.detail()
HYB.detail()
HYC.detail()
# 开始记录
print("第一次记录".center(30, "-"))
HYA.buy() # 会员A买了一次
HYB.retreat() # 会员B退了一次
HYC.buy() # 会员C买了一次
# 输出当前所有人的详细情况
HYA.detail()
HYB.detail()
HYC.detail()
print("第二次记录".center(30, "-"))
HYA.buy() # 会员A买了一次
HYB.buy() # 会员B买了一次
HYC.retreat() # 会员C退了一次
# 输出当前所有会员的详细信息
HYA.detail()
HYB.detail()
HYC.detail()


浙公网安备 33010602011771号