python記錄_day18 反射 判斷函數與方法

来源:https://www.cnblogs.com/zhang-yl/archive/2018/11/09/9936795.html
-Advertisement-
Play Games

一、三個內置函數 1、issubclass(a, b) 判斷a類是否是b類的子類 1 class Foo: 2 pass 3 4 class Zi(Foo): 5 pass 6 7 class Sun(Zi): 8 pass 9 print(issubclass(Zi,Foo)) #True 10 ...


一、三個內置函數

1、issubclass(a, b)  判斷a類是否是b類的子類

 1 class Foo:
 2     pass
 3 
 4 class Zi(Foo):
 5     pass
 6 
 7 class Sun(Zi):
 8     pass
 9 print(issubclass(Zi,Foo))  #True
10 print(issubclass(Zi,Sun))  # False
issubclass

 

2、type(對象)   返回該對象的數據類型,精確識別(即不向上相容)  

 1 class Animal:
 2     pass
 3 
 4 class Cat(Animal):
 5     pass
 6 
 7 class BosiCat(Cat):
 8     pass
 9 
10 c = Cat()    
11 b = BosiCat()
12 print(type(c))   #<class '__main__.Cat'>  會準確說出c是一種Cat,不會說c是一種Animal
type

 

3、isinstance(對象,類)   判斷xx對象是否是xxx類 (向上相容)

class Animal:
    pass

class Cat(Animal):
    pass

class BosiCat(Cat):
    pass

c = Cat()
b = BosiCat()

print(isinstance(c , Cat))     #判斷c 是否是一種Cat
print(isinstance(c,Animal))    #判斷c 是否是一種Animal
print(isinstance(c,BosiCat))
 
結果:
True
True
False
isinstace

 

二、判斷函數與方法

python官方定義:

函數function —— A series of statements which returns some value to a caller. It can also be passed zero or more arguments which may be used in the execution of the body.

方法method —— A function which is defined inside a class body. If called as an attribute of an instance of that class, the method will get the instance object as its first argument (which is usually called self).

從定義看,函數就相當於一個數學公式,它不與其他東西相互關聯,傳遞相應的參數就能用。而方法是,定義在類內部的函數,並且這個函數和類或類的實例對象有某種關聯,訪問時會自動傳遞一個參數作為第一參數。

簡單來說:

函數沒和類或對象進行綁定;

方法和類或對象有綁定

# 區分函數和方法:

 1 def func():
 2  pass
 3 print(func) # <function func at 0x10646ee18>  函數
 4 class Foo:
 5 
 6  def chi(self):
 7  print("我是吃")
 8 f = Foo()
 9 print(f.chi) # <bound method Foo.chi of <__main__.Foo object at
10 0x10f688550>>    方法
函數和方法
 1 class Foo:
 2      def chi(self):
 3          print("我是吃")
 4      @staticmethod
 5      def static_method():
 6          pass
 7      @classmethod
 8      def class_method(cls):
 9          pass
10 
11 f = Foo()
12 
13 print(f.chi) # <bound method Foo.chi of <__main__.Foo object at
14 0x10f688550>>
15 
16 print(Foo.chi) # <function Foo.chi at 0x10e24a488>
17 print(Foo.static_method) # <function Foo.static_method at 0x10b5fe620>
18 print(Foo.class_method) # bound method Foo.class_method of <class
19 '__main__.Foo'>>
20 
21 print(f.static_method) # <function Foo.static_method at 0x10e1c0620>
22 print(f.class_method) #<bound method Foo.class_method of <class
23 '__main__.Foo'>>            
函數和方法

結論:

1. 類方法. 不論任何情況, 都是方法.

2. 靜態方法, 不論任何情況. 都是函數

3. 實例方法, 如果是實例訪問. 就是方法. 如果是類名訪問就是函數.

#官方判斷方法:

通過types模塊引入MethodType  FunctionType 來判斷

 1 from types import FunctionType, MethodType
 2 
 3 class Car:
 4     def run(self): # 實例方法
 5         print("我是車, 我會跑")
 6 
 7     @staticmethod
 8     def cul():
 9         print("我會計算")
10 
11     @classmethod
12     def jump(cls):
13         print("我會jump")
14 
15 c = Car()
16 
17 實例方法:
18 #     1. 用對象.方法   方法
19 #     2. 類名.方法     函數
20 c = Car()
21  print(isinstance(c.run, FunctionType)) # False
22  print(isinstance(Car.run, FunctionType)) # True
23  print(isinstance(c.run, MethodType)) # True
24  print(isinstance(Car.run, MethodType)) # False
25 
26 # 靜態方法 都是函數
27  print(isinstance(c.cul, FunctionType)) # True
28  print(isinstance(Car.cul, FunctionType)) # True
29  print(isinstance(c.cul, MethodType)) # False
30  print(isinstance(Car.cul, MethodType)) # False
31 
32 # 類方法都是方法
33 print(isinstance(c.jump, FunctionType)) # False
34 print(isinstance(Car.jump, FunctionType)) # False
35 print(isinstance(c.jump, MethodType)) # True
36 print(isinstance(Car.jump, MethodType)) # True
判斷

 

三、反射(重點)

關於反射, 其實一共有4個函數:

1. hasattr(obj, str)   判斷obj中是否包含str成員

2. getattr(obj,str)    從obj中獲取str成員

3. setattr(obj, str, value)     把obj中的str成員設置成value      這裡的value可以是值, 也可以是函數或者方法

4. delattr(obj, str) 把obj中的str成員刪除掉

註意:

obj可以是模塊,類,實例對象

以上操作都是在記憶體中進行的, 並不會影響你的源代碼,但是在同一個py文件中,你通過反射修改了類,是會影響到其他對象的。

 

 1 #反射用到的四個函數,常用的是hasattr 和getattr
 2 # setattr(a,b,c)  a是要操作的對象,b是操作對象中的成員字元串形式,c是修改的值
 3 # getattr(a,b)     有返回值,返回值形式a.b    a是要操作的對象,b是操作對象中的成員字元串形式
 4 #delattr(a,b)      a是要操作的對象,b是操作對象中的成員字元串形式
 5 #hasatter(a,b)     a是要操作的對象,b是操作對象中的成員字元串形式
 6 
 7 class Car:
 8 
 9     def __init__(self,color,pai,price):
10         self.color = color
11         self.pai = pai
12         self.price= price
13 
14     def fly(self):
15         print('我的車會飛')
16 
17 c = Car('blue','豐田','18888')
18 f = getattr(Car,"fly")    #操作對象是類,返回值相當於Car.fly
19 print(f)      #<function Car.fly at 0x0000000001EA9D08> 這裡是函數,沒有和類綁定,所以需要下麵手動傳值
20 f(c)       # f是函數,沒有和類綁定,所以需要手動傳值Car.fly(c) ,它是等價於c.fly()的
21 
22 #delattr(Car,"fly")    #操作的是類,把類中fly方法刪除了
23 #c.fly()     #報錯,沒有fly
24 
25 c2 =Car("yellow","bmw",20000)
26 
27 def fly():
28     print("通過對象c修改fly方法")
29     
30 setattr(c,"fly",fly)         #並沒有改變類中的內容,相當於在當前對象中創建了一個fly方法,一個對象是不可能有修改類的許可權的
31 c.fly()       #通過對象c修改fly方法
32 c2.fly()     #我的車會飛
33 c3 = Car("blue","賓士",88888)
34 c3.fly()      #我的車會飛
35 setattr(Car,'fly',lambda self:print('通過類名,修改fly方法')) #通過類名修改fly方法
36 c.fly()     #通過對象c修改fly方法
37 c2.fly()   #通過類名,修改fly方法
38 c3.fly()  #通過類名,修改fly方法
39 c4 = Car("red","悍馬",66666)
40 c4.fly()     #通過類名,修改fly方法

 


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

-Advertisement-
Play Games
更多相關文章
  • 原文:https://webfe.kujiale.com/spring-could-heart/ Spring Cloud 是一個基於 Spring Boot 實現的微服務框架,它包含了實現微服務架構所需的各種組件。 註:Spring Boot 簡單理解就是簡化 Spring 項目的搭建、配置、組合 ...
  • 2018年11月9日,蒟蒻第一次參加NOIP考試,這也是我的第一篇博客。 21:48分,臨睡前,我打開筆記本,在NOIP的前一天晚上,註冊了博客園。發表了第一篇博客。 說是“游記”,但其實並非是真正的“游記”,說起來可能更像“隨筆”,亦或者“感言”。 2018年8月,中考剛剛結束,作為高一的我,正式 ...
  • 基礎很重要,基礎很重要,基礎很重要。重要的事情說三遍,。 程式設計中的控制語句主要有三種:順序、分支和迴圈。我們每天寫的代碼,除了業務相關,裡面會包含大量的控制語句。但是控制語句的基本使用,是否有些坑我們需要避免,以及一些常見的規範我們是否遵守了呢,我們來簡單複習一下。 控制語句包含: 1、分支語句 ...
  • 1 class Base: 2 pass 3 4 class Foo(Base): 5 pass 6 7 class Bar(Foo): 8 pass 9 10 print(issubclass(Bar,Foo)) # True 11 print(issubclass(Foo,Bar)) # Fal ...
  • 相信大家在寫項目的時候遇到過,資料庫里的時間戳類型(時間類型),後臺獲取了,返回前臺,但是前臺的格式不是你想要的格式。例如: 這樣是有毫秒,我在網上找了個簡單又方便的方法: 1、導入JSTL的jar包 2、在jsp頁面加入 3、本來我們輸出是 現在我們輸出是 結果: 最後,如果我們要的格式只要年月日 ...
  • 函數屬性 python中的函數是一種對象,它有屬於對象的屬性。除此之外,函數還可以自定義自己的屬性。註意,屬性是和對象相關的,和作用域無關。 自定義屬性 自定義函數自己的屬性方式很簡單。假設函數名稱為myfunc,那麼為這個函數添加一個屬性var1: 那麼這個屬性var1就像是全局變數一樣被訪問、修 ...
  • 1.利用Filter來過濾的時候大都是Http請求和Http響應,在doFilter()方法中,參數類是ServletRequest和ServletResponse ,使用的時候一般需要強制轉換為HttpServletRequest和HttpServletResponse 。針對這個問題,可以仿照G ...
  • ########模板層######## 模板層其實就是templates文件夾里的html文件 其實這裡的每個html不是真正意義的上html代碼,只有經過模板渲染過後才算的上真正的html頁面。 一、模板語言(變數,深度查詢,過濾器,標簽) 1、變數 在django模板里通過{{ name }} ... ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...