Python 面向對象編程(進階部分)

靜態方法:

通過 @staticmethod 裝飾器即可把其裝飾的方法變為一個靜態方法。普通的方法,可以在實例化后直接調用,并且在方法里可以通過self.調用實例變量或類變量,但靜態方法是不可以訪問實例變量或類變量的,一個不能訪問實例變量和類變量的方法,其實相當于跟類本身已經沒什么關系了,它與類唯一的關聯就是需要通過類名來調用這個方法

示例:

class Dog(object):def __init__(self, name):self.name = name@staticmethoddef eat_static(food):                  # 不能傳入 self 否則會報錯print(' is eating %s' % food)def eat(self, food):print('%s is eating %s' % (self.name, food))d = Dog('A dog')
d.eat_static('bone')                        # 調用靜態方法
d.eat('bone')

輸出結果:

is eating bone
A dog is eating bone

?

類方法:

類方法通過@classmethod裝飾器實現,類方法和普通方法的區別是, 類方法只能訪問類變量,不能訪問實例變量

示例:

class Dog(object):name = 'Dog'                                # 類變量def __init__(self, name):self.name = name@classmethoddef eat_class(cls, food):                   # 不能傳入 self 否則會報錯print('%s is eating %s' % (cls.name, food))def eat(self, food):print('%s is eating %s' % (self.name, food))d = Dog('A dog')
d.eat_class('bone')                             # 調用類方法
d.eat('bone')

輸出結果:

Dog is eating bone
A dog is eating bone

?

?

屬性方法:

屬性方法的作用就是通過 @property 把一個方法變成一個靜態屬性

簡單使用示例:

class Dog(object):def __init__(self, name):self.name = name@propertydef eat(self):print("%s is eating" % self.name)d = Dog("A dog")
d.eat                                           # 調用屬性(無法直接傳參數),加括號會報錯

輸出結果:

A dog is eating

?

給屬性方法賦值

示例:

class Dog(object):def __init__(self, name):self.name = name@propertydef eat(self):print("%s is eating" % self.name)@eat.setterdef eat(self, food):                        # 當給屬性方法賦值時,調用這個方法print('The food is %s' % food)d = Dog("A dog")
d.eat
d.eat = 'bone'

輸出結果:

A dog is eating
The food is bone

?

如果希望屬性方法有參數,需要將參數存為類變量

示例:

class Dog(object):def __init__(self, name):self.name = nameself.__food = None@propertydef eat(self):print("%s is eating %s" % (self.name, self.__food))@eat.setterdef eat(self, food):print('The food is %s' % food)self.__food = foodd = Dog("A dog")
d.eat
d.eat = 'bone'
d.eat

輸出結果:

A dog is eating None
The food is bone
A dog is eating bone

?

刪除屬性方法只需在上面函數的基礎上再寫一個:

@eat.deleterdef eat(self):del self.__food

之后再調用 self.__food屬性時就會報錯,已經找不到了。

?

類的特殊成員方法:

1.__doc__:表示類的描述信息

class Dog(object):'''這個類是用來描述狗這個對象的'''def __init__(self):passprint(Dog.__doc__)

輸出結果:

這個類是用來描述狗這個對象的

?

2.__module__、 __class__

???????? __module__ 表示當前操作的對象在那個模塊

??? __class__???? 表示當前操作的對象的類是什么

lib\aa.py:

class C(object):def __init__(self, name):self.name = name

index.py:

from lib.aa import Cobj = C('name')
print(obj.__module__)
print(obj.__class__)

輸出結果:

lib.aa

<class ’lib.aa.C’>

?

3.__init__:構造方法

4.__del__:析構函數

5.__call__:對象后面加括號,觸發執行

注:構造方法的執行是由創建對象觸發的,即:對象 = 類名() ;而對于 __call__ 方法的執行是由對象后加括號觸發的,即:對象() 或者 類()()

class Foo:def __init__(self):passdef __call__(self, *args, **kwargs):print('__call__')obj = Foo()         # 執行 __init__
obj()               # 執行 __call__
Foo()()

輸出結果:

__call__
__call__

?

6__dict__

通過類調用:查看類里的所有屬性(不包括實例里的)

通過實例調用:查看實例里的所有屬性(不包括類里的)

class Foo:def __init__(self):passdef __call__(self, *args, **kwargs):print('__call__')obj = Foo()
print(Foo.__dict__)
print(obj.__dict__)

輸出結果:

{'__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__module__': '__main__', '__init__': <function Foo.__init__ at 0x000001CED095D378>, '__dict__': <attribute '__dict__' of 'Foo' objects>, '__doc__': None, '__call__': <function Foo.__call__ at 0x000001CED3A9B510>}
{}

?

7.__str__:如果一個類中定義了__str__方法,那么在打印 對象 時,默認輸出該方法的返回值

不使用__str__時:

class Foo(object):def __init__(self, name):self.name = nameobj = Foo('A obj')
print(obj)

輸出結果:

<__main__.Foo object at 0x0000024051A5F0F0>

?

如果加上__str__:

class Foo(object):def __init__(self, name):self.name = namedef __str__(self):return '<obj:%s>' % self.nameobj = Foo('obj name')
print(obj)

輸出結果:

<obj:A obj>

?

8.__getitem__、__setitem__、__delitem__

用于索引操作,如字典。以上分別表示獲取、設置、刪除數據

class Foo(object):def __getitem__(self, key):print('__getitem__', key)def __setitem__(self, key, value):print('__setitem__', key, value)def __delitem__(self, key):print('__delitem__', key)obj = Foo()result = obj['k1']      # 自動觸發執行 __getitem__
obj['k2'] = 'name'      # 自動觸發執行 __setitem__
del obj['k1']           # 自動觸發執行 __delitem__

輸出結果:

__getitem__ k1
__setitem__ k2 name
__delitem__ k1

?

9.__new__ 、__metaclass__

先看一段代碼:

class Foo(object):def __init__(self, name):self.name = namef = Foo("name")
print(type(f))
print(type(Foo))

輸出結果:

<class '__main__.Foo'>
<class 'type'>

?

所以,f對象是Foo類的一個實例Foo類對象是 type 類的一個實例,即:Foo類對象 是通過type類的構造方法創建

類默認是由 type 類實例化產生,type類中如何實現的創建類?類又是如何創建對象?

類中有一個屬性 __metaclass__,其用來表示該類由 誰 來實例化創建,所以,我們可以為 __metaclass__ 設置一個type類的派生類,從而查看 類 創建的過程。

自定義元類:

class MyType(type):def __init__(cls, *args, **kwargs):print("Mytype __init__", *args, **kwargs)def __call__(cls, *args, **kwargs):print("Mytype __call__", *args, **kwargs)obj = cls.__new__(cls)print("obj ", obj, *args, **kwargs)print(cls)cls.__init__(obj, *args, **kwargs)return objdef __new__(mcs, *args, **kwargs):print("Mytype __new__", *args, **kwargs)return type.__new__(mcs, *args, **kwargs)print('here...')class Foo(object, metaclass=MyType):def __init__(self, name):self.name = nameprint("Foo __init__")def __new__(cls, *args, **kwargs):print("Foo __new__", cls, *args, **kwargs)return object.__new__(cls)f = Foo("Name")
print("f", f)
print("fname", f.name)

類的生成 調用 順序依次是 __new__ --> __init__ --> __call__

?

轉載于:https://www.cnblogs.com/dbf-/p/10649162.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/278019.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/278019.shtml
英文地址,請注明出處:http://en.pswp.cn/news/278019.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

分享實錄|爭議不斷地EOS,我們如何才能理性看待?

1 EOS基本介紹 EOS是Block.One公司正在研發的一個區塊鏈底層公鏈系統&#xff0c;目的是解決現有的區塊鏈應用性能低、安全性差、開發難度高以及過度依賴手續費的問題&#xff0c;實現分布式應用的性能擴展。EOS提供帳戶&#xff0c;身份驗證&#xff0c;數據庫&#xff0c;異步…

Teams的Incoming Webhook

我在去年的一篇文章里介紹過Teams的outgoing webhook&#xff0c;這個可以用來實現一個簡單的用戶和service對話機制。 Teams除了outgoing webhook以外&#xff0c;還有一個incoming webhook&#xff0c;從名字上我們也可以立刻知道&#xff0c;這個webhook是用來處理進入Team…

Comet OJ - Contest #0題解

傳送門 菜爆了……總共只有一道題會做的……而且也沒有短裙好難過 為啥必須得有手機才能注冊賬號啊喂……歧視么…… \(A\) 解方程 推一下柿子大概就是 \[x-\sqrt{n}yz2\sqrt{yz}\] 如果\(\sqrt{n}\)是無理數&#xff0c;那么就是 \[xyz,{n\over 4}yz\] 那么要滿足\(n\)必須是\…

tornado 08 數據庫-ORM-SQLAlchemy-表關系和簡單登錄注冊

tornado 08 數據庫-ORM-SQLAlchemy-表關系和簡單登錄注冊 引言 #在數據庫&#xff0c;所謂表關系&#xff0c;只是人為認為的添加上去的表與表之間的關系&#xff0c;只是邏輯上認為的關系&#xff0c;實際上數據庫里面的表之間并沒有所謂的表關系 一、一對一表關系 Module #需…

Teams的manifest文件開始支持多語言

Teams發展速度飛快&#xff0c;Teams app的manifest文件schema也迎來了版本1.5&#xff0c;在這個版本里&#xff0c;很大的一個改進是支持多語言。 讓我們一起來看看&#xff0c;如何在manifest文件里配置多語言。 1&#xff0c;我們需要先把manifest文件設置成v1.5 {"…

白白的(baibaide)

白白的&#xff08;baibaide&#xff09; 有一個長度為 $n$ 的序列 $a_1, a_2, \dots, a_n$&#xff0c;一開始每個位置都是白色。如果一個區間中每個位置都是白色&#xff0c;則稱這是一個白白的區間。如果一個白白的區間向左或向右延長后都不是白白的區間了&#xff0c;則稱這…

如何利用Python網絡爬蟲爬取微信朋友圈動態--附代碼(下)

前天給大家分享了如何利用Python網絡爬蟲爬取微信朋友圈數據的上篇&#xff08;理論篇&#xff09;&#xff0c;今天給大家分享一下代碼實現&#xff08;實戰篇&#xff09;&#xff0c;接著上篇往下繼續深入。一、代碼實現1、修改Scrapy項目中的items.py文件。我們需要獲取的數…

使用Adaptive cards來構建Teams app的界面

Teams app的task module十分好用&#xff0c;當用戶點擊了一個卡片上的按鈕是可以在Teams里彈出一個對話框&#xff0c;對話框的內容可以是開發人員自己的一個網頁頁面&#xff0c;或者是adaptive card。 在我的LuckyDraw bot里&#xff0c;我比較了這兩種的優勢和劣勢&#xf…

Boosting(提升方法)之GBDT

一、GBDT的通俗理解 提升方法采用的是加法模型和前向分步算法來解決分類和回歸問題&#xff0c;而以決策樹作為基函數的提升方法稱為提升樹&#xff08;boosting tree&#xff09;。GBDT(Gradient Boosting Decision Tree)就是提升樹算法的一種&#xff0c;它使用的基學習器是C…

CC攻擊原理及防范方法

一、 CC攻擊的原理&#xff1a; CC攻擊的原理就是攻擊者控制某些主機不停地發大量數據包給對方服務器造成服務器資源耗盡&#xff0c;一直到宕機崩潰。CC主要是用來消耗服務器資源的&#xff0c;每個人都有這樣的體驗&#xff1a;當一個網頁訪問的人數特別多的時候&#xff0c…

Team photo的新api

Graph API的更新速度真是快&#xff0c;今年9月中旬又增加了關于Team photo的兩個新的api。 https://docs.microsoft.com/en-us/graph/api/team-get-photohttps://docs.microsoft.com/en-us/graph/api/team-update-photo 今天就給大家介紹一下如何使用這兩個新的api。 實際上說…

BZOJ 1047: [HAOI2007]理想的正方形 單調隊列瞎搞

題意很簡明吧&#xff1f; 枚舉的矩形下邊界和右端點即右下角&#xff0c;來確定矩形位置&#xff1b; 每一個縱列開一個單調隊列&#xff0c;記錄從 i-n1 行到 i 行每列的最大值和最小值&#xff0c;矩形下邊界向下推移的時候維護一下&#xff1b; 然后在記錄的每一列的最大值…

分享到Teams

在今年三月份末&#xff0c;Teams的官方文檔推出了一個新功能&#xff1a;將網頁&#xff08;一個URL&#xff09;分享到Teams里。 也就是說開發人員現在可以很方便的開發一個頁面&#xff0c;頁面里有一個Teams的圖標&#xff0c;當訪問此頁面的最終用戶點擊這個圖標后可以將…

xshell使用xftp傳輸文件和使用pure-ftpd搭建ftp服務

xshell使用xftp傳輸文件 首先安裝xftp&#xff0c;然后建立會話&#xff0c;步驟和xshell一樣&#xff0c;在使用的時候用CtrlALTf呼出&#xff0c;左邊是windows桌面&#xff0c;右面是linux&#xff0c;雙擊或拖拽都可以實現命令互傳。 使用pure-ftpd搭建ftp服務 首先安裝yum…

MySQL命令行查詢亂碼解決方法

轉自Agoly的博客&#xff0c;原文鏈接https://www.cnblogs.com/qmfsun/p/4846467.html 感謝博主Agoly這篇文章說的很詳細很透徹。 MySQL會出現中文亂碼的原因不外乎下列幾點&#xff1a;1.server本身設定問題&#xff0c;例如還停留在latin1 2.table的語系設定問題(包含charact…

Teams Bot如何判斷用戶所在的時區

一說到時間&#xff0c;就會聯想到時區&#xff0c;夏令時等頭痛的問題&#xff0c;不同國家有不同國家的規定。如果你希望你的Teams Bot可以判斷出當前用戶所在的時區&#xff0c;從而可以針對性的進行一些處理時&#xff0c;你要做好心理準備&#xff0c;這個復雜程度遠遠超過…

『流暢的Python』第1~4章筆記_數據結構、編碼

由于1~4章內容零散且基礎&#xff0c;所以統計一下涉及到的內容&#xff0c;記錄一下&#xff0c;方便查閱&#xff08;第一張圖右鍵新頁面打開即可看到清晰大圖&#xff09;

docker 安裝ELK

參考文檔&#xff1a; Docker ELK使用文檔&#xff1a;http://elk-docker.readthedocs.io/ 1.拉取鏡像 查看 Docker Hub 的鏡像 docker search elk 拉取鏡像 sudo docker pull sebp/elk 2.啟動容器 docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -p 4560:4560 -it --na…

在Teams Hackathon上介紹LuckyDraw

很榮幸有機會在今天的Teams Hackathon上介紹LuckyDraw這個teams app。 因為到場的都是各路開發高手&#xff0c;所以當時在準備這個ppt的時候特別增加了難度等級&#xff0c;哈哈。 從如何構建云原生的Teams app&#xff0c;到IaC&#xff0c;重點講了如何開發一個面向全球用戶…

Word 2010 制作文檔結構之圖標自動編號設置

注意&#xff1a; 使用圖片自動編號時&#xff0c;如果文檔標題使用的樣式是通過“將所選內容保存為新快速樣式”所生成的樣式&#xff0c;則圖片自動編號不會生效 因此設置標題樣式時&#xff0c;不要 新建樣式&#xff0c;直接使用word預設的“標題 1”樣式和“標題 2”樣式即…