python基礎(28):isinstance、issubclass、type、反射

来源:https://www.cnblogs.com/liuhui0308/archive/2019/11/15/11869857.html
-Advertisement-
Play Games

1. isinstance和issubclass 1.1 isinstance isinstance(obj,cls)檢查是否obj是否是類 cls 的對象 class Foo(object): pass obj = Foo() isinstance(obj, Foo) 實例: class Base ...


1. isinstance和issubclass

1.1 isinstance

isinstance(obj,cls)檢查是否obj是否是類 cls 的對象

class Foo(object):
  pass
  
obj = Foo()
  
isinstance(obj, Foo)

實例:

class Base(object):
  pass

class Foo(Base):
  pass

obj1 = Foo()
print(isinstance(obj1,Foo))  # 檢查第一個參數(對象)是否是第二個參數(類及父類)的實例。
print(isinstance(obj1,Base)) # 檢查第一個參數(對象)是否是第二個參數(類及父類)的實例。


obj2 = Base()
print(isinstance(obj2,Foo))  # 檢查第一個參數(對象)是否是第二個參數(類及父類)的實例。
print(isinstance(obj2,Base)) # 檢查第一個參數(對象)是否是第二個參數(類及父類)的實例。

1.2 issubclass

issubclass(sub, super)檢查sub類是否是 super 類的派生類 

class Foo(object):
  pass
 
class Bar(Foo):
  pass
 
issubclass(Bar, Foo)

實例:

class Base(object):
  pass

class Foo(Base):
  pass

class Bar(Foo):
  pass

print(issubclass(Bar,Base)) # 檢查第一個參數是否是第二個參數的 子子孫孫類

2. type

獲取當前對象是由哪個類創建。

class Foo(object):
    pass

obj = Foo()

print(obj,type(obj)) # 獲取當前對象是由那個類創建。
if type(obj) == Foo:
    print('obj是Foo類型')

實例:

class Foo(object):
    pass

class Bar(object):
    pass

def func(*args):
    foo_counter =0
    bar_counter =0
    for item in args:
        if type(item) == Foo:
            foo_counter += 1
        elif type(item) == Bar:
            bar_counter += 1
    return foo_counter,bar_counter

# result = func(Foo(),Bar(),Foo())
# print(result)

v1,v2 = func(Foo(),Bar(),Foo())
print(v1,v2)

3. 反射

3.1 什麼是反射

反射的概念是由Smith在1982年首次提出的,主要是指程式可以訪問、檢測和修改它本身狀態或行為的一種能力(自省)。這一概念的提出很快引發了電腦科學領域關於應用反射性的研究。它首先被程式語言的設計領域所採用,併在Lisp和麵向對象方面取得了成績。 

3.2 python中的反射

python面向對象中的反射:通過字元串的形式操作對象相關的屬性。python中的一切事物都是對象(都可以使用反射)。

四個可以實現自省的函數:

hasattr:

def hasattr(*args, **kwargs): # real signature unknown
    """
    Return whether the object has an attribute with the given name.
    
    This is done by calling getattr(obj, name) and catching AttributeError.
    """
    pass

getattr:

def getattr(object, name, default=None): # known special case of getattr
    """
    getattr(object, name[, default]) -> value
    
    Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.
    When a default argument is given, it is returned when the attribute doesn't
    exist; without it, an exception is raised in that case.
    """
    pass

setattr:

def setattr(x, y, v): # real signature unknown; restored from __doc__
    """
    Sets the named attribute on the given object to the specified value.
    
    setattr(x, 'y', v) is equivalent to ``x.y = v''
    """
    pass

delattr:

def delattr(x, y): # real signature unknown; restored from __doc__
    """
    Deletes the named attribute from the given object.
    
    delattr(x, 'y') is equivalent to ``del x.y''
    """
    pass

四個方法的使用例子:

class Foo:
    f = '類的靜態變數'
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def say_hi(self):
        print('hi,%s'%self.name)

obj=Foo('egon',73)

#檢測是否含有某屬性
print(hasattr(obj,'name'))
print(hasattr(obj,'say_hi'))

#獲取屬性
n=getattr(obj,'name')
print(n)
func=getattr(obj,'say_hi')
func()

print(getattr(obj,'aaaaaaaa','不存在啊')) #報錯

#設置屬性
setattr(obj,'sb',True)
setattr(obj,'show_name',lambda self:self.name+'sb')
print(obj.__dict__)
print(obj.show_name(obj))

#刪除屬性
delattr(obj,'age')
delattr(obj,'show_name')
delattr(obj,'show_name111')#不存在,則報錯

print(obj.__dict__)

這四個方法適用於類和對象(一切皆對象,類本身也是一個對象)

類也是對象:

class Foo(object):
 
    staticField = "old boy"
 
    def __init__(self):
        self.name = 'wupeiqi'
 
    def func(self):
        return 'func'
 
    @staticmethod
    def bar():
        return 'bar'
 
print getattr(Foo, 'staticField')
print getattr(Foo, 'func')
print getattr(Foo, 'bar')

反射當前模塊成員:

#!/usr/bin/env python
# -*- coding:utf-8 -*-

import sys


def s1():
    print 's1'


def s2():
    print 's2'


this_module = sys.modules[__name__]

hasattr(this_module, 's1')
getattr(this_module, 's2')

導入其他模塊,利用反射查找該模塊是否存在某個方法。

module_test.py:

# -*- coding:utf-8 -*-

def test():
    print('from the test')

index.py:

# -*- coding:utf-8 -*-
 
"""
程式目錄:
    module_test.py
    index.py
"""

import module_test as obj

#obj.test()

print(hasattr(obj,'test'))

getattr(obj,'test')()

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

-Advertisement-
Play Games
更多相關文章
  • app.py: from flask import Flask, render_template from datetime import datetime app = Flask(__name__) @app.route('/') def hello_world(): context = { 't ...
  • 大數取餘數(數組) 今天做學校的oj時遇到一題,問題可見一下截圖: 查遍各大論壇,都沒有遇到合適的方法,普通方法不可用,要採用數組的形式。 被除數超過long long類型,不能採用常規思路,否則會出現wrong answer。值得註意的一點,是不能用double等實數類型,只有整數類型的才可以求餘 ...
  • 一、網路編程 1.網路、網路協議(一套規則) 2.網路模型: (1)七層模型-七層 物理層(比如網線、錨)、數據鏈路層(比如電壓電流)、網路層、傳輸層、會話層、表示層、應用層(我們的活動基本都在這一層) (2)四層模型 鏈路層、網路、傳輸層、應用層 (3)每一層都有相應的協議負責交換信息或者協同工作 ...
  • 導讀:wx.showToast(OBJECT) 顯示消息提示框。 OBJECT參數說明: 參數 類型 必填 說明 最低版本 title String 是 提示的內容 icon String 否 圖標,有效值"success"、"loading" image String 否 自定義圖標的本地路... ...
  • gocron源代碼中的Action那個地方,就是個空介面類型Action interface{},可以傳遞任意類型進去,這裡是傳了個函數進去 介面是合約,任何類型只要實現了介面中的方法,那麼就可以認為實現了這個介面。對於沒有方法的介面interface{}類型,可以看做所有的類型都實現了這個介面,因 ...
  • 概述Map 集合是無序的 key-value 數據結構。Map 集合中的 key / value 可以是任意類型,但所有的 key 必須屬於同一數據類型,所有的 value 必須屬於同一數據類型,key 和 value 的數據類型可以不相同。聲明 Map //demo_14.go package m ...
  • 區別 : ① 關鍵字: 抽象類 關鍵字 abstract class 介面 interface ② 子類實現 : 抽象類 子類 通過關鍵字 extends繼承 介面 子類 通過關鍵字 implements 實現。 ③ 構造方法 : 抽象類中存在構造方法 介面中沒有構造方法 ④ 屬性和方法: 抽象類中 ...
  • 源碼中有這麼一句,這個函數要求返回的是[]cli.Command,cli.Command類型的切片,這個地方直接使用字面值初始化了一個切片返回去了 數組的字面值初始化,一般是需要指定數組的大小,可以使用...三個點來代替大小,根據後面初始化的個數來計算,下麵就是字面值初始化一個數組 切片和數組很類似 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...