python學習筆記之類class(第六天)

来源:http://www.cnblogs.com/wushank/archive/2016/03/13/5274199.html
-Advertisement-
Play Games

       參考文檔:              1、金角大王博客:http://www.cnblogs.com/alex3714/articles/5188179.html              2、銀角大王博客:http://www.cnblogs.com/wupeiqi/articles


 

     參考文檔:

             1、金角大王博客:http://www.cnblogs.com/alex3714/articles/5188179.html

             2、銀角大王博客:http://www.cnblogs.com/wupeiqi/articles/5017742.html

 

1、反射之__import__:

        我們知道import語句是用來導入外部模塊的,當然還有from...import...也可以,但是其實import實際上是使用builtin函數__import__來工作的。
        在一些程式中,我們可以動態地去調用函數,如果我們知道模塊的名稱(字元串)的時候,我們可以很方便的使用動態調用。

__import__(module_name[, globals[, locals[, fromlist]]]) #可選參數預設為globals(),locals(),[]
__import__('os')    
__import__('os',globals(),locals(),['path','pip'])  #等價於from os import path, pip


例: 以字元串的形式導入模塊

mod = __import__('sys')
print(mod.path)

例:以字元串的形式調用模塊中的函數

func = getattr(mod,'path')
print(func)


例:從一個包中導入一個模塊 ,包名為main,模塊名為mod

aa = __import__('main.mod')

aa = __import__('main', globals={}, locals={}, fromlist=['mod'])

aa = __import__('main',globals(),locals(),['mod'])

m = getattr(aa, 'mod')
print(m.first('kevin')) 

n = getattr(m, 'first')
print(type(n))
n('kevin')


註:web框架中根據不同的URL,來載入不同的模塊,進行不同的處理。

 

2、類與對象:

        __init__ 的方法 完成初始化。構造函數

        __del__ 的方法 對象銷毀,析構函數

       __call__ 調用方法

       所有的實例方法都擁有一個 self 參數來傳遞當前實例,類似於 this。
       可以使用 __class__ 來訪問類型成員。

       還有些內置特殊的屬性:

              __doc__   #類型幫助信息

              __name__ # 類型名稱

              __module__ # 類型所在模塊
              __bases__ # 類型所繼承的基類

              __dict__ # 類型字典,存儲所有類型成員信息。

     例:


class peason(object):
    '''this is peason class'''
    #靜態欄位
    aa = 'nihao'
    bb = ['a',1,'b',2,'c',3]
    cc = {'a':'wangkai','b':'gonghui'}
    
    def __init__(self,name,flag):
        self.name = name                             #動態欄位
        self.__flag = flag                               #私有欄位


    def __del__(self):
        print('i will go')
    
    def __call__(self,caa):                            #call方法
        print('this is call method',caa)     

  
    def __priv(self):                                    #私有方法 
        print('hello,this is privacy method',self.__flag)
    
    
    def first(self):                                       #動態方法
        print('hello,this is dymamic method',self.name)
        self.__priv()                                     #調用私有方法
        return self.__flag                              #調用私有欄位
    
    @staticmethod                                     #靜態方法
    def foo():
        print('this is static method')
    
    @property                                           #屬性                
    def bar(self):
        print(self.name)
        self.__priv()
        return "this is property"
    
    @property                                         #屬性(只讀)

    def flag(self):
        return self.__flag
    
    @flag.setter                                       #修改私有欄位值
    def flag(self,value):
        self.__flag = value
        
print('#################')    
print(peason.__doc__,peason.__name__,peason.__module__,peason.__bases__,peason.__dict__)
print('#################')        
print(peason.aa,peason.bb,peason.cc)         #獲取靜態欄位
print('#################')    
print(peason.foo())                                    #獲取靜態方法
print('#################')    
pp = peason('wang','true')                         #類實例化
print(pp.name)                                         #通過對象獲取動態欄位
print('#################')                
print(pp.first())                                          #通過對象獲取動態方法
print('#################')          
print(pp.bar)                                             #通過對象獲取屬性
print('#################')          
print(pp._peason__priv())                          #特殊調用方式
print('#################')          
print(pp.flag)
pp.flag = 'false'                                         #通過屬性修改私有欄位值
print(pp.flag)

pp('aa')                                                      #call方法調用


註:靜態的可以直接通過類來訪問,而動態的只能通過調用對象的方式來訪問;

       私有欄位和方法能通過方法和屬性調用;

       只讀或只寫的欄位,修改需要@flag.setter 和 class peason(object):來實現

 

3、繼承:

Python編程中類可以承繼父類屬性,形式為class 類名(父類),子類可以繼承父類的所有方法和屬性,也可以重載父類的成員函數及屬性,須註意的是子類成員函數若重載父類(即名字相同),則會使用子類成員函數

例:


class SchoolMember(object):
members = 0 #初始學校人數為0
def __init__(self,name,age):
self.name = name
self.age = age

def tell(self):
pass

def enroll(self):
'''註冊'''
SchoolMember.members +=1
print("\033[32;1mnew member [%s] is enrolled,now there are [%s] members.\033[0m " %(self.name,SchoolMember.members))

def __del__(self):
'''析構方法'''
print("\033[31;1mmember [%s] is dead!\033[0m" %self.name)

class Teacher(SchoolMember):
def __init__(self,name,age,course,salary):
super(Teacher,self).__init__(name,age)
self.course = course
self.salary = salary
self.enroll()


def teaching(self):
'''講課方法'''
print("Teacher [%s] is teaching [%s] for class [%s]" %(self.name,self.course,'s12'))

def tell(self):
'''自我介紹方法'''
msg = '''Hi, my name is [%s], works for [%s] as a [%s] teacher !''' %(self.name,'Oldboy', self.course)
print(msg)

class Student(SchoolMember):
def __init__(self, name,age,grade,sid):
super(Student,self).__init__(name,age)
self.grade = grade
self.sid = sid
self.enroll()


def tell(self):
'''自我介紹方法'''
msg = '''Hi, my name is [%s], I'm studying [%s] in [%s]!''' %(self.name, self.grade,'Oldboy')
print(msg)

if __name__ == '__main__':
t1 = Teacher("Alex",22,'Python',20000)
t2 = Teacher("TengLan",29,'Linux',3000)

s1 = Student("Qinghua", 24,"Python S12",1483)
s2 = Student("SanJiang", 26,"Python S12",1484)

t1.teaching()
t2.teaching()
t1.tell()

       新式類以object為基類,在python3之後版本原來有經典類將不在使用,而且新式類的多類繼承是以廣度代替了經典類的深度搜索方式。

        例,A、B、C、D四個類,其中B和C繼承A,D又繼承B和C,即class D(B,C)

        繼承的方法:

              經典類的搜索順序是B,A,C     搜索到第一個方法結束

              新式類的搜索順序是B,C。

例:經典類寫法


class A(object):
    def __init__(self):
        print('this is class A')
    def test(self):
        print('this is parent test')
        
class B(A):
    def __init__(self):
        print('this is class B')
        
class C(A):
    def __init__(self):
        print('this is class C')
    def test(self):
        print('this is son C test')
        
class D(B,C):
    def __init__(self):
        print('this is class D')
    
R = D()
R.test()

經典類寫法結果為:

this is class D
this is parent test

新式類寫法結果為:

this is class D
this is son C test


 

4、抽象類+抽象方法 = 介面 (用於規範)

由於python 沒有抽象類、介面的概念,所以要實現這種功能得abc.py 這個類庫,

抽象基類(或者ABCs)是Python里一個相同的特性。抽象基類由abc模塊構成,包含了一個叫做ABCMeta的metaclass。這個metaclass由內置的isinstance()和issubclass()特別處理

具體方式如下:


from abc import ABCMeta,abstractmethod
from _pyio import __metaclass__

class headers(object):
    __metaclass__ = ABCMeta
    
    def __init__(self):
        print('this is abc class')
        
    @abstractmethod
    def fun(self):
        pass
    
class foo(headers):
    def __init__(self):
        print('__init__')
        
    def fun(self):
        print('foo.fun')
        
f = foo()
f.fun()


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

-Advertisement-
Play Games
更多相關文章
  • 背景      在博客 噁心的0.5四捨五入問題 一文中看到一個關於 0.5 不能正確的四捨五入的問題。主要說的是 double 轉換到 BigDecimal 後,進行四捨五入得不到正確的結果: 輸出的結果為: 301353.0499999999883584678173065185546875301
  • 接上一篇隨筆,利用克拉莫法則求解n元線性方程組。 代碼:  
  • Atitit. Async await 優缺點 非同步編程的原理and實現 java c# php   1. async & await的來源1 2. 非同步編程history1 2.1. 線程池 2 2.2. 返回值2 2.3. Semaphore 信號量2 2.4. 線程的異常,主線程可以捕獲到麽2
  • C語言形式參數和實際參數的概念和在一個函數中交換外部變數的方法介紹
  • 關於Android Develop 文檔明明本地下載了,但在瀏覽器里打開還是很卡,原因是html文檔中有鏈接Google伺服器的Link和script。 網上有很多解決方案,其中一種是刪除裡面所有鏈接Google伺服器的Link和script。 我在網上下載的JAVA代碼這兩行修飾css代碼是怎麼也
  • atitit.RandomAccessFile rws rwd 的區別於聯繫   1. Rw rws  rwd1 2. "rws" 模式1 3. rwd"模式2       "r"    以只讀方式打開。調用結果對象的任何 write 方法都將導致拋出 IOException。  "rw" 
  • 要深入瞭解ClassLoader,首先就要知道ClassLoader是用來乾什麼的,顧名思義,它就是用來載入Class文件到JVM,以供程式使用 的。我們知道,java程式可以動態載入類定義,而這個動態載入的機制就是通過ClassLoader來實現的,所以可想而知ClassLoader的重 要性如何
  • 初學JAVA做一些總結,有說的不對的地方希望大家多多指教。 如果能給同樣帶有迷惑的同學帶來幫助,是很開森的一件事情。 剛學JAVA的時候肯定會碰到這三個環境變數的設定,往往總是知其然不知其所以然, 按照說明做完了卻不知道為什麼這麼做,這裡簡單做一些總結說明。 首先,什麼是環境變數 環境變數是指在操作...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...