日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

issubclass和isinstance 反射 内置方法(魔术方法)

發布時間:2025/6/17 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 issubclass和isinstance 反射 内置方法(魔术方法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • issubclass 和 isinstance
    • issubclass
    • isinstance
  • 反射
    • 通過用戶輸入的key,value往對象中賦值
    • 動態的往對象中放方法
    • 動態的刪除屬性
    • 動態刪除對象中的屬性
    • 刪除對象中屬性名為name字符串的屬性
    • 反射:通過=字符串=來獲取,設置,刪除對象中的屬性或方法
  • 寫的時候想起之前的內容
  • 例子(還是上面的四個方法,hasattr(),setattr(),getattr(),delattr())
  • 點攔截方法, setattr,delattr,getattr
    • 原來的字典使用方式
    • __item__系列 對象通過[]中括號取值,賦值,刪除值得時候,會自動調用
    • call 對象加括號會調用它
    • enter 和 __exit 我們所使用的就是 with open

issubclass 和 isinstance

issubclass

判斷一個類是不是另一個類子類

class Foo:passclass Bar:passclass T(Foo, Bar):passprint(issubclass(T, Bar))

isinstance

判斷第一個是不是第二個的參數生成的對象

class Foo:passclass Bar:passa = Foo() print(isinstance(a, Foo)) print(isinstance(a, Bar))

反射

1.用戶輸入一段字符串,執行該字符串對應的方法
hasattr():判斷字符串在對象里面是否有,返回值是布爾類型
getatter():把字符串對應的屬性或者方法拿出來
setatter():向對象中添加一個和字符串一樣名字的方法或者屬性
delatter():通過字符串來刪除屬性或方法

class Foo:
def run(self):
print("run......")

def speak(self):print("speak......") p = Foo() # 方案一: print(Foo.__dict__['run'](p)) # 方案二: cmd = input("請輸入功能:") if hasattr(p, cmd):getattr(p, cmd) else:print("沒有這個功能")

通過用戶輸入的key,value往對象中賦值

key = input("key:") value = input("value:") setattr(Foo, key, value) print(p.age)

動態的往對象中放方法

def eat():print('eat...')# return eat()setattr(p,'eat222',eat)s = p.eat222s()print(s)

動態的刪除屬性

# 原始的刪除方法p.name = 'xc'print(p.__dict__)del p.nameprint(p.__dict__)

動態刪除對象中的屬性

choice = input("請輸入需要刪除的功能:")p.name = 'xc'p.age = 18print(p.__dict__)delattr(p, choice)print(p.__dict__)

刪除對象中屬性名為name字符串的屬性

class Foo:def __init__(self, name, age):self.name = nameself.age = agedef run(self):print("run...")p = Foo('xc', 123)cmd = 'name'if hasattr(p, cmd):print("存在")print(p.__dict__)delattr(p, cmd)print(p.__dict__)else:print("不存在")

反射:通過=字符串=來獲取,設置,刪除對象中的屬性或方法

寫的時候想起之前的內容

class A:passclass B(A):passclass X(B):def __init__(self, name, age):self.name = nameself.age = agedef run(self):print("run...")p = X('xc', 12)print(p.__dict__) # 打印類中所有的屬性print(X.__bases__) # 只打印父類print(X.mro()) # 打印所有的父類,即分類以上的,并且查找順序嚴格按照mro的順序來

例子(還是上面的四個方法,hasattr(),setattr(),getattr(),delattr())

class BlackMedium:feature = "ugly"def __init__(self, name, addr):self.name = nameself.addr = addrdef sell_house(self):print("最怕中介買房子,自己還是傻逼")def rent_house(self):print("最怕中介租房子,自己還是傻逼")b1 = BlackMedium('東方明珠', '上海') print(b1.__dict__)a = 'sell_house' getattr(b1, a)()# 刪除屬性或者方法 delattr(b1, 'name') print(b1.__dict__)# 模塊也是對象,也可以使用四個方法 import osprint(hasattr(os, 'path1')) # False
  • 使用自己寫的模塊,通過反射來獲取模塊中是否有我要使用的屬性或方法,若果有就執行,沒有就報錯
  • 類似于 hasattr(模塊名/文件名,變量名/方法名-->要使用字符串形式)

  • 內置方法(就是重寫一些方法,更改返回值)
    • init :格式化屬性
    • str :給類添加返回值,也就是可以使用print打印類,返回的不再是內存地址
    • repr :和str類似,不過是在交互式命令下直接寫變量名,會執行__repr__

點攔截方法, setattr,delattr,getattr

  • 如果去對象中取屬性,一旦取不到,會進入到__getattr__
  • 如果刪除對象中的屬性,就會進入__delattr__
  • 如果去給對象中的屬性賦值,就會進入到__setattr__
  • 并且都不會改變原有的值,就是不執行原來的語句,轉來執行自身定義的里面的代碼
class Foo:def __init__(self, name):self.name = namedef __getattr__(self, item):return 1def __delattr__(self, item):return 2def __setattr__(self, key, value):print(3)return 3p = Foo('xc')p.name = 100print(p.name)del p.nameprint(p.xc)

原來的字典使用方式

  • dict
di = dict(name='xc', age=18)# 正常方式print(di['name'])# 我們需要實現的方式di.name --> 這樣肯定是報錯的 di.age = 10class Mydict(dict):def __init__(self, **kwargs):super().__init__(**kwargs)def __setattr__(self, key, value):self[key] = valuedef __getattr__(self, item):return self[item]di = Mydict(a=123, b=3456) print(di["a"]) print(di.a)

__item__系列 對象通過[]中括號取值,賦值,刪除值得時候,會自動調用

call 對象加括號會調用它

enter 和 __exit 我們所使用的就是 with open

  • 上下文管理器.

轉載于:https://www.cnblogs.com/xiongchao0823/p/11448938.html

總結

以上是生活随笔為你收集整理的issubclass和isinstance 反射 内置方法(魔术方法)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。