2020602----python学习第22天
今日内容
作业:栈/顺序查找
可迭代对象
约束 + 异常
反射
内容详细
1 作业
1.1代码从上到下执行
#示例一
print('你好')
def func():
pass
func()
#输出内容为:你好
#示例二
class Foo(object):
x = 1
def func(self):
pass
print(Foo.x)
#输出结果为:1
#示例三
class Foo(object):
print('你好')
def func(self):
pass
print(Foo())
#输出结果为:你好
#示例四
class Foo(object):
x = 1
def func(self):
pass
class Meta(object):
y = 123
def show(self):
pass
print(Foo.x,Foo.Meta.y)
#输出结果为:1,123
#示例五
class Foo:
print('你')
x = 1
def func(self):
pass
class Meta:
print('好')
y = 123
def show(self):
pass
print(Foo.x,Foo.Meta.y)
#输出的结果为:
# 你
# 好
# 1 123
1.2栈
栈与队列的区别:队列是先进先出,栈是后进先出。
class Stack(object):
"""
后进先出
"""
def __init__(self):
self.data_list = []
def push(self,val):
"""
向栈中压入一个数据(入栈)
:param val:
:return:
"""
self.data_list.append(val)
def pop(self):
"""
从栈中拿走一个数据(出栈)
:return:
"""
return self.data_list.pop()
2 可迭代对象
表象:可以被for循环对象就可以成为称为可迭代对象。
class Foo:
pass
obj = Foo()
#如何让一个对象变成可迭代对象
#在类中实现__iter__方法且返回一个迭代器(生成器)
class Foo:
def __iter__(self):
return iter([1,2,3,4])
obj = Foo()
class Foo:
def __iter__(self):
yield 1
yield 2
yield 3
yield 4
obj = Foo()
#记住:只能能被for循环就是去看他内部的iter方法。
3 约束
#约束子类中中必须写send方法,如果不写,则调用适合就要报安抛出 NotImplementedError
#示例一
class Interfact(object):
def send(self):
raise NotImplementedError()
class Message(Interfact):
def send(self):
print('发送短信')
class Email(Interfact):
def send(self):
print('发送邮箱')
#示例二
class Message(object):
def msg(self):
print('发短信')
def email(self):
print('发邮箱')
def wechat(self):
print('发微信')
obj = Message()
obj.msg()
obj.email()
obj.wechat()
#示例三
class BaseMessage(object):
def send(self,a1):
raise NotImplementedError('子类中必须有send方法')
class Msg(BaseMessage):
def send(self):
pass
class Email(BaseMessage):
def send(self):
pass
class Wechat(BaseMessage):
def send(self):
pass
class DingDing(BaseMessage):
def send(self):
print('钉钉')
obj = Email()
obj.send()
4 反射:根据字符粗的形式去某个对象中操作他的成员。
#根据字符串的形式去某个对象中操作他的成员
#getattr(对象,"字符串")根据字符串的形式去某个对象中获取对象的成员。
class Foo(object):
def __init__(self,name):
self.name = name
def loginc(self):
pass
obj = Foo('alex')
#获取变量
obj.name
v1 = getattr(obj,'name')
#获取方法
method_name = getattr(obj,'login')
method_name()
#hasattr(对象,"字符串")根据字符串的形式去某个对象中判断是否有该成员。
from wsgiref.simple_server import make_server
class View(object):
def login(self):
return '登录'
def logout(self):
return '退出'
def index(self):
return '首页'
def func(environ,start_response):
start_response(""200 OK",[('Content-Type', 'text/plain; charset=utf-8')])
#
obj = View()
# 获取用户输入的URL
method_name= environ.get('PATH_INFO').strip('/')
if not hasattr(obj,method_name):
return ["sdf".encode("utf-8")]
response = getattr(obj,method_name)()
return [response.encode("utf-8")]
#作用:写一个网站,用户只要来方法,就自动找到第三个参数并执行
server = make_server('192.168.12.87',8000,func)
server.serve_forever()
#setattr(对象,"变量","值")根据字符串的形式去某个对象中设置成员。
class Foo(object):
pass
print(obj.k1)
obj =Foo()
obj.k1 = 999
setattr(obj,'k1',888)
print(obj.k1)
#delattr(对象,"变量")根据字符串的形式去某个对象中去删除成员。
class Foo(object):
pass
obj = Foo()
obj.k1 = 999
delattr(obj,'k1')
print(obj.k1) #上面已经删除obj对象k1变量,所以报错;AttributeError: 'Foo' object has no attribute 'k1'
python一切皆对象
py文件/包/类/对象
python一切皆对象,所以以后想要通过字符串的形式操作其内部成员都可以通过反射的机制来实现。
5 模块importlib
根据字符串的形式导入模块。
模块= importlib.import_module('utils.redis')
#方法一
from day22.utils import redis
redis.func()
#输出内容为:redis
#方法二
import importlib
#用字符串的形式导入模块
redis = importlib.import_module('day22.utils.redis')
#用字符串的形式去对象(模块)找到他的成员
getattr(redis,'func')()
#输出内容为:redis
作业
1.学习笔记
2.思维导图

浙公网安备 33010602011771号