Python內(nèi)置函數(shù)delattr的具體用法
delattr 函數(shù)用于刪除屬性。
delattr(x, 'foobar') 相等于 del x.foobar。
語(yǔ)法
setattr 語(yǔ)法:delattr(object, name)
參數(shù)
- object -- 對(duì)象。
- name -- 必須是對(duì)象的屬性。
英文文檔:
delattr(object, name)
This is a relative of setattr(). The arguments are an object and a string. The string must be the name of one of the object's attributes. The function deletes the named attribute, provided the object allows it. For example, delattr(x, 'foobar') is equivalent to del x.foobar.說(shuō)明:
定義類
#coding=utf-8
# class_my.py 定義類 (新式類)
# 定義類
class Person:
# 類屬性 (class) (注:類/類方法 能修改類屬性; 對(duì)象不能修改類屬性,更改的只是實(shí)例屬性)
name = "name" # 公共屬性
__adress = "adress" # 私有屬性 (__屬性 表示私有)
# 構(gòu)造方法(對(duì)象創(chuàng)建調(diào)用) (__init__ 表示構(gòu)造)
def __init__(self, name, address = "地球"):
# 實(shí)例屬性
self.name = name # (注:類屬性與實(shí)例屬性名稱相同時(shí)用實(shí)例屬性,實(shí)例屬性被刪除后使用類屬性)
self.__adress = address
Person.setData(self)
# 析構(gòu)方法(對(duì)象銷毀調(diào)用) (__del__ 表示析構(gòu))
def __del__(self):
print("對(duì)象被銷毀.")
# toString()
def __str__(self):
return "Person.class"
# 實(shí)例方法 (this)
def setName(self, name): # self可為其他字符串 (this)
self.name = name; # 修改 實(shí)例屬性 (不存在自動(dòng)添加)
# 類方法 (static)
@classmethod
def setName_cls(cls, name):
cls.name = name # 修改 類屬性
# 靜態(tài)方法 (tools)
@staticmethod
def setName_sta(name): # (注:參數(shù)部分)
return name
def getName(self):
return self.name
def setData(self):
# 實(shí)例屬性
self.__age = 21 # 私有屬性
self.sex = "女" # 公共屬性
def show(self):
print("Hello! %s"%self.name)
print("Address:%s"%self.__adress) # 使用自身私有屬性
self.__eat() # 使用自身私有方法
def __eat(self): # 私有方法
print("eat")
# ======= 函數(shù)調(diào)用 ======
if __name__ == "__main__":
# - 創(chuàng)建對(duì)象 -
ps = Person("LY")
# --- 調(diào)用方法 ---
# 調(diào)用實(shí)例方法
ps.setName("LY") # 實(shí)例調(diào)用 實(shí)例方法
ps.show()
# 調(diào)用類方法
Person.setName_cls("Person") # 類調(diào)用 類方法
ps.setName_cls("Person") # 實(shí)例調(diào)用 類方法
# 調(diào)用靜態(tài)方法 ()
print(ps.setName_sta("Per")) # 實(shí)例調(diào)用 靜態(tài)方法
print(Person.setName_sta("Per")) # 類調(diào)用 靜態(tài)方法
# --- 訪問(wèn)屬性 ---
print(ps.getName())
print(ps.name) # 訪問(wèn) 類屬性 的公共屬性值
print(ps.sex) # 訪問(wèn) 實(shí)例屬性 的公共屬性值
# --- 修改屬性 ---
# 修改實(shí)例屬性
ps.name = "123" # 修改 類屬性 (注:并非真修改,只是向?qū)ο笾袆?chuàng)建了一個(gè)實(shí)例屬性)
del ps.name # 刪除 實(shí)例屬性 (注:實(shí)例不能(非類方法)刪除 類屬性, 只是刪除了對(duì)象中創(chuàng)建的實(shí)例屬性,類屬性依然存在)
del ps.sex # 刪除 實(shí)例屬性 (注:真刪除,刪除后不能訪問(wèn))
# 修改類屬性
Person.name = "Person" # 修改類屬性
Person.setName_cls("Person") # 類 調(diào)用 類方法 修改 類屬性 (注:類不能調(diào)用實(shí)例方法)
ps.setName_cls("Person") # 對(duì)象 通過(guò) 類方法 修改 類屬性
del Person.name # 刪除類屬性
# - 刪除對(duì)象 -
del ps
# > Less is more! "靜態(tài)方法"和"類方法/屬性"同級(jí)都可理解為"靜態(tài)",靜態(tài)方法適合做工具箱,類方法/屬性可認(rèn)為在靜態(tài)區(qū),隨手拿來(lái)即用,而實(shí)例則需要實(shí)例化才能使用. (--本人的個(gè)人理解)
# ======= 函數(shù)調(diào)用 ======
繼承
#coding=utf-8
# class_extend.py 繼承(新式類)
# --- 單繼承 ---
# 父類
class Animal(object):
def __init__(self, name = "動(dòng)物"):
self.name = name
def run(self):
print("%s在跑."%self.name)
# 子類
class Cat(Animal): # 繼承 (父類寫()內(nèi))
def __init__(self, name, ot = ""):
super(Cat, self).__init__(name)
def miao(self):
print("喵")
# --- 多繼承 ---
class Donkey: # 驢
def walk(self):
print("walk")
def eat(self):
print("Donkey.eat")
class Horse: # 馬
def run(self):
print("run")
def eat(self):
print("Horse.eat")
class Mule(Donkey, Horse): # 騾(驢+馬)
pass
# === 多態(tài) ====
def animalRun(animal): # 參數(shù)接收自己及其自己的子類
animal.run()
# ======= 函數(shù)調(diào)用 ======
if __name__ == "__main__":
# - 單繼承調(diào)用 -
ani = Animal()
ani.run()
cat = Cat("貓")
cat.run()
cat.miao()
# - 多繼承調(diào)用 -
mule = Mule()
mule.walk()
mule.run()
mule.eat() # 多個(gè)父類中有相同的方法時(shí),調(diào)用()內(nèi)最前面的父類(Donkey)的方法
# - 多態(tài)調(diào)用 -
ani = Animal()
animalRun(ani)
cat = Cat("貓")
animalRun(cat)
# ======= 函數(shù)調(diào)用 ======
重寫
#coding=utf-8
# class_rewrite.py 重寫(新式類)
class Animal(object):
def run(self):
print("Animal.run")
def eat(self, food = "食物"):
print("eat:%s"%food)
class Cat(Animal):
# 子類重寫了父類的方法
def run(self):
print("Cat.run")
def eat(self):
# 調(diào)用父類的方法
super(Cat, self).eat("貓糧")
# ======= 函數(shù)調(diào)用 ======
if __name__ == "__main__":
ani = Animal()
ani.run()
ani.eat()
cat = Cat()
cat.run()
cat.eat()
# ======= 函數(shù)調(diào)用 ======
屬性方法
#!/usr/bin/env python
# coding=utf-8
__author__ = 'Luzhuo'
__date__ = '2017/5/13'
# class_propertiemethod.py 屬性方法
# 屬性方法: 把方法變成靜態(tài)屬性
# 寫法1
class PM_1(object):
def __init__(self):
self.__name_str = "PropertieMethod_1"
# 獲取
@property
def name(self): # 注意,方法名相同
return self.__name_str
# 設(shè)置
@name.setter
def name(self, name):
self.__name_str = name
# 刪除
@name.deleter
def name(self):
del self.__name_str
if __name__ == "__main__":
pm = PM_1()
print(pm.name)
pm.name = "PM"
print(pm.name)
del pm.name
# print(pm.name)
# ==========================================================
# 寫法2
class PM_2(object):
def __init__(self):
self.__name_str = "PropertieMethod_2"
# 獲取
def getname(self):
return self.__name_str
# 設(shè)置
def setname(self, name):
self.__name_str = name
# 刪除
def delname(self):
del self.__name_str
# property(fget=None, fset=None, fdel=None, doc=None) # 返回一個(gè)property 屬性, 實(shí)現(xiàn)原理見(jiàn) 內(nèi)置函數(shù) 文章 property_my 塊代碼(http://blog.csdn.net/rozol/article/details/70603230)
name = property(getname, setname, delname)
if __name__ == "__main__":
p = PM_2()
print(p.name)
p.name = "PM2"
print(p.name)
del p.name
# print(p.name)
反射
#!/usr/bin/env python
# coding=utf-8
__author__ = 'Luzhuo'
__date__ = '2017/5/13'
# class_reflection.py 反射
# 通過(guò)反射機(jī)制,可動(dòng)態(tài)修改程序運(yùn)行時(shí)的狀態(tài)/屬性/方法
# Python的反射機(jī)制性能如何? 在Android中Java的反射產(chǎn)生垃圾而執(zhí)行g(shù)c,從而導(dǎo)致UI不流暢,而且性能低
# Python的反射性能(1億次測(cè)試): 直接獲取屬性值:反射獲取屬性值 = 1:1.164 ;直接設(shè)置屬性值:反射設(shè)置屬性值 = 1:1.754
def setname(self, name):
self.name = name
class Clazz(object):
def __init__(self):
self.name = "Clazz"
def getname(self):
return self.name
if __name__ == "__main__":
c = Clazz()
# --- 方法 ---
if hasattr(c, "getname"):
# 獲取
method = getattr(c, "getname", None)
if method:
print("setname_ref: {}".format(method())) # 獲取方法對(duì)象并執(zhí)行
if not hasattr(c, "setname"):
# 添加
setattr(c, "setname", setname) # 添加方法
method = getattr(c, "setname", None)
if method:
method(c, "Reflection")
print("setname_raw: {}".format(c.getname()))
if hasattr(c, "setname"):
# 刪除
delattr(c, "setname")
# c.setname(c, "Demo")
# --- 屬性 ---
if not hasattr(c, "age"):
# 添加
setattr(c, "age", 21) # 添加方法
var = getattr(c, "age", None)
print("age_ref: {}".format(var))
print("age_raw: {}".format(c.age))
if hasattr(c, "age"):
# 獲取
var = getattr(c, "age", None)
print("age_ref: {}".format(var))
if hasattr(c, "age"):
# 刪除
delattr(c, "age")
# print("age_raw: {}".format(c.age))
文檔注釋
#!/usr/bin/env python
# coding=utf-8
__author__ = 'Luzhuo'
__date__ = '2017/5/13'
# class_doc.py 文檔注釋
# 文檔注釋的編寫
class Foo(object):
'''
這是一個(gè)類
'''
def method(self, data):
'''
這是一個(gè)方法
:param data: 需要的數(shù)據(jù)
:return: 返回的數(shù)據(jù)
'''
return "method"
def func(data):
'''
這是一個(gè)函數(shù)
:param data: 需要的數(shù)據(jù)
:return: 返回的數(shù)據(jù)
'''
return "func"
if __name__ == "__main__":
# 打印文檔
print(Foo.__doc__)
print(Foo().method.__doc__)
print(func.__doc__)
創(chuàng)建類的原理
#!/usr/bin/env python
# coding=utf-8
__author__ = 'Luzhuo'
__date__ = '2017/5/13'
# class_origin.py 類的由來(lái)
# 類由type類實(shí)例化產(chǎn)生, 而type由解釋器產(chǎn)生
age = 21
def __init__(self):
self.name = "origin"
def getname(self):
return self.name
def setname(self, name):
self.name = name
def delname(self):
del self.name
if __name__ == "__main__":
# 用type創(chuàng)建類(類名, 基類元組, 類成員字典)
Foo = type('Foo', (object,), {'__init__' : __init__, "getname" : getname, "setname" : setname,
"delname": delname, "age" : age})
# 實(shí)例化類
f = Foo()
# 使用
print(f.age)
print(f.getname())
f.setname("ClassOrigin")
print(f.getname())
f.delname()
# print(f.getname())
# ==================================================================================
# 元類 (type創(chuàng)建類原理)
# 元類是用于創(chuàng)建所有類的類, Python中是type類 (注意,類也是對(duì)象,也是被創(chuàng)建出來(lái)的,即萬(wàn)物皆對(duì)象), 下面將演示type類的功能
# __call__ 的調(diào)用 (__new__在__init__之前調(diào)用, __call__在什么時(shí)候調(diào)用呢)
class Foobar(object):
def __call__(self, *args, **kwargs):
print("Foobar __call__")
if __name__ == "__main__":
fb = Foobar()
fb() # 只有在這個(gè)時(shí)候才會(huì)調(diào)用__call__屬性
Foobar()() # 等同于該方式
# ------
# metaclass指定類有誰(shuí)來(lái)創(chuàng)建
# Python創(chuàng)建類時(shí)會(huì)尋找__metaclass__屬性,(包括父類)沒(méi)有找到將使用內(nèi)建元類type
class MyType(type):
def __init__(self, *args, **kwargs):
print("MyType __init__")
def __call__(self, *args, **kwargs):
print("MyType __call__")
obj = self.__new__(self)
self.__init__(obj, *args, **kwargs)
return obj
def __new__(cls, *args, **kwargs):
print("MyType __new__")
return type.__new__(cls, *args, **kwargs)
class Foo(object, metaclass=MyType): # (Python3.x寫法) metaclass 用于創(chuàng)建類, Python創(chuàng)建類時(shí)會(huì)尋找__metaclass__屬性,(包括父類)沒(méi)有找到將使用內(nèi)建元類type
# __metaclass__ = MyType # Python2.x寫法
def __init__(self):
print("Foo __init__")
def __new__(cls, *args, **kwargs): # 用于實(shí)例化對(duì)象
print("Foo __new__")
return object.__new__(cls) # 必須是返回
def show(self):
print("Foo show")
if __name__ == "__main__":
print("start")
f = Foo()
f.show()
# MyType __new__ => MyType __init__ => 'start' => MyType __call__ => Foo __new__ => Foo __init__ => 'Foo show'
其他的一些補(bǔ)充
#!/usr/bin/env python
# coding=utf-8
__author__ = 'Luzhuo'
__date__ = '2017/5/13'
# class_other.py 關(guān)于類的一些補(bǔ)充
class Demo(object):
def show(self):
print("Demo show")
if __name__ == "__main__":
# __module__ 該對(duì)象的模塊名
# __class__ 該對(duì)象的類對(duì)象
print(Demo.__module__) # 該對(duì)象的模塊名 => __main__
print(Demo.__class__) # 該對(duì)象的類對(duì)象 => <class 'type'>
obj = Demo()
print(obj.__module__) # 該對(duì)象的模塊名 => __main__
print(obj.__class__) # 該對(duì)象的類對(duì)象 => <class '__main__.Demo'>
obj.__class__.show(obj) # 類對(duì)象可被使用
# ============================
# __dict__ 類或?qū)ο笾械乃谐蓡T
print(Demo.__dict__) # 類屬性
print(obj.__dict__) # 實(shí)例屬性
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
python 自動(dòng)監(jiān)控最新郵件并讀取的操作
這篇文章主要介紹了python 自動(dòng)監(jiān)控最新郵件并讀取的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03
利用Python中的Xpath實(shí)現(xiàn)一個(gè)在線匯率轉(zhuǎn)換器
這篇文章主要給大家介紹了關(guān)于如何利用Python中的Xpath實(shí)現(xiàn)一個(gè)在線匯率轉(zhuǎn)換器的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Python requests的SSL證書驗(yàn)證方式
這篇文章主要介紹了Python-requests的SSL證書驗(yàn)證方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
windows10環(huán)境下用anaconda和VScode配置的圖文教程
這篇文章主要介紹了windows10環(huán)境下用anaconda和VScode配置的圖文教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家介紹的非常詳細(xì),需要的朋友可以參考下2020-03-03
Python下使用Scrapy爬取網(wǎng)頁(yè)內(nèi)容的實(shí)例
今天小編就為大家分享一篇Python下使用Scrapy爬取網(wǎng)頁(yè)內(nèi)容的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-05-05

