今日內容
- 講作業
- 堆疊
- 順序查找
- 可迭代物件
- 約束 + 例外
- 反射
內容詳細
1.作業
1.1 代碼從上到下執行
print('你好')
def func():
pass
func()
class Foo:
X = 1
def func(self):
pass
Foo.X
class Foo:
print('你好')
def func(self):
pass
class Foo:
x = 1
def func(sef):
pass
class Meta:
y = 123
def show(self):
pass
class Foo:
print('你')
x = 1
def func(sef):
pass
class Meta:
print('好')
y = 123
def show(self):
pass
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回圈物件就可以稱為是可迭代物件: "x" [11,2] {}...
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
obj = Foo()
記住:只要能被for回圈就是去看他內部的iter方法,
3.約束
# 約束字類中必須寫send方法,如果不寫,則呼叫時候就報拋出 NotImplementedError
class Interface(object):
def send(self):
raise NotImplementedError()
class Message(Interface):
def send(self):
print('發送短信')z
class Email(Interface):
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 obj = Foo('alex') # 獲取變數 v1 = getattr(obj,'name') # 獲取方法 method_name = getattr(obj,'login') method_name() -
hasattr(物件,'字串') 根據字符粗的形式去某個物件中判斷是否有該成員,
#!/usr/bin/env python # -*- coding:utf-8 -*- 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: pass obj = Foo() obj.k1 = 999 setattr(obj,'k1',123) # obj.k1 = 123 print(obj.k1) -
delattr(物件,'變數') 根據字符粗的形式去某個物件中洗掉成員,
class Foo: pass obj = Foo() obj.k1 = 999 delattr(obj,'k1') print(obj.k1)
python一切皆物件
- py檔案
- 包
- 類
- 物件
python一切皆物件,所以以后想要通過字串的形式操作其內部成員都可以通過反射的機制實作,
5. 模塊:importlib
根據字串的形式匯入模塊,
#from utils import redis
import importlib
#用字串的形式匯入模塊,
redis=importlib.import_module('utils.redis')
getattr(redis,'func')()
模塊 = importlib.import_module('utils.redis')
import importlib
path='utils.mongo.func'#mongo.py,utils為目錄名稱
module_path,func_name=path.rsplit('.',maxsplit=1)
module_object=importlib.import_module(module_path)
getattr(module_object,func_name)()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/191478.html
標籤:Python
上一篇:pyjsonrpc的使用
