day26-python之封裝

来源:https://www.cnblogs.com/sqy-yyr/archive/2019/08/16/11366713.html
-Advertisement-
Play Games

1.動態導入模塊 2.包裝標準類型 3.雙下劃線開頭的attr方法: 4.反射 5.多態 6.封裝示範一 ...


1.動態導入模塊

# module_t=__import__('m1.t')
# print(module_t)

# module_t = __import__('m1.t')
# print(module_t)


# module_t.t.test1()
# from m1.t import *
# from m1.t import test1,_test2
#
# test1()
# _test2()

# module_t.t.test1()
# from m1.t import *
# from m1.t import  test1,_test2
# test1()
# _test2()


# import  importlib
# m=importlib.import_module('m1.t')
# print(m)
# m.test1()
# m._test2()


import  importlib
m = importlib.import_module('m1.t')
print(m)
m.test1()
m._test2()

2.包裝標準類型

# class List(list):
#     def append(self, p_object):
#         if type(p_object) is str:
#             # self.append(p_object)
#             super().append(p_object)
#         else:
#             print('只能添加字元串類型')
#
#     def show_midlle(self):
#         mid_index=int(len(self)/2)
#         return self[mid_index]
class List(list):
    def  append(self, p_object):
        if type(p_object) is str:
            super().append(p_object)
        else:
            print('只能添加字元串類型')

    def show_midlle(self):
        mid_index = int(len(self)/2)
        return self[mid_index]

l1 = List('helloworld')
print(l1,type(l1))
print(l1.show_midlle())
# l1.append(111111111111111)
l1.append('SB')
print(l1)

# l2=list('hell oworld')
# print(l2,type(l2))

# l1=List('helloworld')
# print(l1,type(l1))
# print(l1.show_midlle())
# l1.append(1111111111111111111111)
# l1.append('SB')
# print(l1)

3.雙下劃線開頭的attr方法:

# class Foo:
#     x=1
#     def __init__(self,y):
#         self.y=y
#
#     def __getattr__(self, item):
#         print('執行__getattr__')
#
# f1=Foo(10)
# print(f1.y)
# print(getattr(f1,'y'))   #len(str)--->str.__len__()
# f1.sssssssssssssssssssssssssssssssssssss




# class Foo:
#     x=1
#     def __init__(self,y):
#         self.y=y
#
#     def __delattr__(self, item):
#         print('刪除操作__delattr__')
#
# f1=Foo(10)
# del f1.y
# del f1.x



#
# class Foo:
#     x=1
#     def __init__(self,y):
#         self.y=y
#
#     def __setattr__(self, key, value):
#         print('__setattr__執行')
#         # self.key=value
#         self.__dict__[key]=value
# f1=Foo(10)
# print(f1.__dict__)
# f1.z=2
# print(f1.__dict__)








# class Foo:
#     def __getattr__(self, item):
#         print('------------->')
#
# # print(Foo.__dict__)
# print(dir(Foo))
# f1=Foo()
#
# print(f1.x)  #只有在屬性不存在時,會自動觸發__getattr__
#
# del f1.x #刪除屬性時會觸發_delattr__
#
# f1.y=10
# f1.x=3  # 設置屬性的時候會觸發——setattr———











# class Foo:
#     def __init__(self,name):
#         self.name=name
#     def __getattr__(self, item):
#         print('你找的屬性【%s】不存在' %item)
#     def __setattr__(self, k,v):
#         print('執行setattr',k,v)
#         if type(v) is str:
#             print('開始設置')
#             # self.k=v #觸發__setattr__
#             self.__dict__[k]=v.upper()
#         else:
#             print('必須是字元串類型')
#     def __delattr__(self, item):
#         print('不允許刪除屬性【%s】' %item)
        # print('執行delattr',item)
        # del self.item
        # self.__dict__.pop(item)
 




# f1=Foo('alex')
# f1.age=18 #觸發__setattr__
# print(f1.__dict__)
# print(f1.name)
# print(f1.age)
# print(f1.gender)
# print(f1.slary)
# print(f1.__dict__)
# del f1.name
# print(f1.__dict__)

4.反射

# class BlackMedium:
#     feture='Ugly'
#     def __init__(self,name,addr):
#         self.name=name
#         self.addr=addr
#
#     def sell_hourse(self):
#         print('【%s】 正在賣房子,傻逼才買呢' %self.name)
#
#     def rent_hourse(self):
#         print('【%s】 正在租房子,傻逼才租呢' % self.name)
#
#
# print(hasattr(BlackMedium,'feture'))
# getattr()

class BlackMedium:
    feture='Ugly'
    def __init__(self,name,addr):
        self.name = name
        self.addr = addr

    def sell_hourse(self):
        print('[%s]正在賣房子,傻逼才買呢'%self.name)

    def rent_hourse(self):
        print('[%s]正在租房子,傻逼才租呢'%self.name)

b1 = BlackMedium('萬成置地', '天露園')



#
# b1=BlackMedium('萬成置地','天露園')
# b1.name--->b1.__dic__['name']
# print(b1.__dict__)
#
# # b1.name
# # b1.sell_hourse
# print(hasattr(b1,'name'))
# print(hasattr(b1,'sell_hourse'))
# print(hasattr(b1,'selasdfasdfsadfasdfasdfasdfasdl_hourse'))
#
#
#
# print(getattr(b1,'name'))
# print(getattr(b1,'rent_hourse'))
# func=getattr(b1,'rent_hourse')
# func()
# # print(getattr(b1,'rent_hourseasdfsa')) #沒有則報錯
# print(getattr(b1,'rent_hourseasdfsa','沒有這個屬性')) #沒有則報錯

b1.sb = True
setattr(b1,'sb',True)
setattr(b1,'sb1',123)
setattr(b1,'name','SB')
setattr(b1,'func',lambda x:x+1)
setattr(b1,'func1',lambda self:self.name+'sb')

print(b1.func1(b1))
#
#
# # b1.sb=True
# setattr(b1,'sb',True)
# setattr(b1,'sb1',123)
# setattr(b1,'name','SB')
# setattr(b1,'func',lambda x:x+1)
# setattr(b1,'func1',lambda self:self.name+'sb')
# print(b1.__dict__)
# print(b1.func)
# print(b1.func(10))
# print(b1.func1(b1))
# del b1.sb
# del b1.sb1
# delattr(b1,'sb')
# print(b1.__dict__)

 

5.多態

#_*_coding:utf-8_*_
# __author__ = 'Linhaifeng'
# class H2O:
#     def __init__(self,name,temperature):
#         self.name=name
#         self.temperature=temperature
#     def turn_ice(self):
#         if self.temperature < 0:
#             print('[%s]溫度太低結冰了' %self.name)
#         elif self.temperature > 0 and self.temperature < 100:
#             print('[%s]液化成水' %self.name)
#         elif self.temperature > 100:
#             print('[%s]溫度太高變成了水蒸氣' %self.name)
#     def aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(self):
#         pass
__author__ = 'shiqianyu'
class H2O:
    def __init__(self,name,temperature):
        self.name = name
        self.temperature = temperature
    def turn_ice(self):
        if self.temperature<0:
            print('[%s]溫度太低結冰了'%self.name)
        elif self.temperature>0 and self.temperature<100:
            print('[%s]液化成水'%self.name)
        elif self.temperature>100:
            print('[%s]溫度太高變成了水蒸汽'%self.name)
    def aaaaaaaaaaaaaaa(self):
        pass
class Water(H2O):
    pass
class Ice(H2O):
    pass
class Steam(H2O):
    pass


# class Water(H2O):
#     pass
# class Ice(H2O):
#     pass
# class Steam(H2O):
#     pass

w1=Water('',25)
i1=Ice('',-20)
s1=Steam('蒸汽',3000)

# w1.turn_ice()
# i1.turn_ice()
# s1.turn_ice()

# def func(obj):
#     obj.turn_ice()

# func(w1)  #---->w1.turn_ice()
# func(i1)  #---->i1.turn_ice()
# def func(obj):
#     obj.turn_ice()
#
# func(w1)
# func(i1)
# func(s1)


def func(obj):
    obj.turn_ice()

func(w1)
func(i1)
func(s1)

6.封裝示範一

#_*_coding:utf-8_*_
# __author__ = 'Linhaifeng'
#
# class Room:
#     def __init__(self,name,owner,width,length,high):
#         self.name=name
#         self.owner=owner
#         self.__width=width
#         self.__length=length
#         self.__high=high
#
#     def tell_area(self): #此時我們想求的是面積
#         return self.__width * self.__length *self.__high
#
#     def tell_width(self):
#         return self.__width

__author__ = 'shiqianyu'
class Room:
    def __init__(self,name,owner,width,length,high):
        self.name = name
        self.owner = owner
        self.__width = width
        self.__length = length
        self.__high = high

    def tell_area(self):
        return self.__width*self.__length*self.__high

    def tell_width(self):
        return self.__width

r1 = Room('衛生','alex',100,100,500)
# area = r1.__width*r1.__length
print(r1.tell_area())

# r1=Room('衛生間','alex',100,100,10000)

# arear=r1.__width * r1.__length
# print(r1.tell_area())

 7.授權

# import time
# class FileHandle:
#     def __init__(self,filename,mode='r',encoding='utf-8'):
#         # self.filename=filename
#         self.file=open(filename,mode,encoding=encoding)
#         self.mode=mode
#         self.encoding=encoding
#     def write(self,line):
#         print('------------>',line)
#         t=time.strftime('%Y-%m-%d %X')
#         self.file.write('%s %s' %(t,line))
#
#     def __getattr__(self, item):
#         # print(item,type(item))
#         # self.file.read
#         return getattr(self.file,item)
import  time
class FileHandle:
    def __init__(self,filename,mode='r',encoding='utf-8'):
        self.file = open(filename,mode,encoding=encoding)
        self.mode = mode
        self.encoding = encoding

    def write(self,line):
        print('-------------------->',line)
        t = time.strftime('%Y-%m-%d %X')
        self.file.write('%s %s'%(t,line))

    def __getattr__(self, item):
        return getattr(self.file,item)

f1 = FileHandle('a.txt','w+')
f1.write('111111111111111\n')
f1.write('cpu負載過高\n')
f1.write('記憶體剩餘不足\n')
f1.write('硬碟剩餘不足\n')
f1.seek(0)
print(f1.read())




# f1=FileHandle('a.txt','w+')
# print(f1.file)
# print(f1.__dict__)
# print('==>',f1.read) #觸發__getattr__
# print(f1.write)
# f1.write('1111111111111111\n')
# f1.write('cpu負載過高\n')
# f1.write('記憶體剩餘不足\n')
# f1.write('硬碟剩餘不足\n')
# f1.seek(0)
# print('--->',f1.read())

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、AOP是什麼 AOP(面向切麵編程),可以說是一種編程思想,其中的Spring AOP和AspectJ都是現實了這種編程思想。相對OOP(面向過程編程)來說,提供了另外一種編程方式,對於OOP過程中產生的橫切性問題,這些橫切性與業務無關,可以通過預編譯方式和運行期動態代理來實現。比如可以應用在: ...
  • 1.首先下載小程式開發工具 2.小程式中的wxml就相當於html , wxss就相當於css 3.佈局和html佈局幾乎一樣 4.寬度使用百分比 5.input框里的文字上下居中是用padding撐出來的 6.最下麵的文字靠右,view相當於一個塊元素,設定寬度後,text-align右對齊 簡單 ...
  • 1. JVM運行時劃分哪幾個區域?哪些區域是線程共用的?哪些區域是線程獨占的? JVM運行時一共劃分:程式計數器、虛擬機棧、堆、本地方法棧、方法區。 線程共用的數據區域:堆、方法區。 線程獨享的數據區域區域:程式計數器、虛擬機棧、本地方法棧。 2. 這幾個記憶體區域分別存放什麼數據? 程式計數器記錄當 ...
  • 一、賦值運算符 1.賦值類運算符包括兩種: (1)基本賦值運算符:= (2)擴展的賦值運算符: += -= *= /= &= 賦值類的運算符優先順序:先執行等號右邊的表達式,將執行結果賦值給左邊的變數 2.例子: 總結:擴展類的運算符不改變運算結果後的變數的類型 二、字元串的連接運算符 關於java中 ...
  • 前言 通過代碼片段分別介紹服務端渲染、客戶端渲染、對象緩存三種方式的寫法。 代碼片段僅供參考,具體實現需要根據業務場景自行適配,但思想都是一樣。 一、服務端渲染方式 1、介面返回html頁面的設置 2、先從緩存中取,有就返回。 3、緩存中沒有,就手動渲染。 springboot1.5.x的寫法: s ...
  • 3.1.如何實現可迭代對象和迭代器對象 結果 3.2如何使用生成器函數實現可迭代對象 3.3.如何進行反向迭代以及如何實現反向迭代 反向迭代 要想實現反向迭代必須實現__reversed__方法 ...
  • 最近再學習ajax,上課老師讓我們實現一個類似百度首頁實現搜索框的功能,剛開始做的時候沒有一點頭緒,查閱大量網上的資源後,發現之前的與我們現在的有些區別,所以在此寫出來,希望能對大家有所幫助. 下麵先展示下效果圖:(ps:圖片中的文字是參考的,不具有任何的攻擊意義) 項目的目錄結構: 一:首先是lo ...
  • 寫這篇文章,就是希望讀者把本文提出的這幾個問題,經過深刻的準備後,一般來說,能囊括大部分的消息隊列的知識點。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...