python中一些特殊方法的作用

我們先暫且稱呼為特殊方法。

單下劃線開頭(_foo)雙下劃線開頭的(__foo)雙下劃線開頭和結尾的( __foo__)
代表不能直接訪問的類屬性,需通過類提供的接口進行訪問,不能用“from xxx import *”而導入;代表類的私有成員代表python里特殊方法專用的標識,如 _init_()代表類的構造函數

文章目錄

    • 1 __repr__方法
    • 2 __str__ 方法
    • 3 __str__ and __repr__ example
    • 4 python 類中的self是是什么
    • 5 python3中的__slots__
    • 6. __call__方法
    • 7. 對象表現形式(__bytes__)
    • 8.str.format()的簡單用法
      • 字段名:省略;數字;變量名
      • 轉換字段: !s !r !a

1 __repr__方法

_repr__是類的內建方法,所有的類都是繼承自Object類,因此在外部調用時,需要使用repr函數,好比Node類通過重寫__repr_,從而重寫了repr。
這是文檔上標注的,因為理解不太貼切,所以還是放上官方介紹吧。

Return a string containing a printable representation of an object.
For many types, this function makes an attempt to return a string that would yield an object with the same value when passed to eval(), otherwise the representation is a string enclosed in angle brackets that contains the name of the type of the object together with additional information often including the name and address of the object.
A class can control what this function returns for its instances by defining a repr() method.

class Node(object):def __init__(self, value, flag = 1):self._value = valueself._children = []self._flag = flagdef add_child(self, node):self._children.append(node)def __repr__(self):return 'Node({!r})'.format(self._value)if __name__ == '__main__':n1 = Node(0)print(n1)#Node(0)

2 str 方法

此方法返回對象的字符串表示形式。在對象上調用print()或str()函數時調用此方法。
這個方法必須返回String對象。如果我們沒有為類實現_str__()函數,那么使用內置的對象實現來實際調用_repr__()函數。

3 str and repr example

我們注意到無論是__str__還是__repr__方法,返回的都要求是str類型

class Person(object):name = ""age = 0def __init__(self, personName, personAge):self.name = personNameself.age = personAgedef __repr__(self):return '{name'+self.name + ',' + 'age:' + str(self.age) + '}'def __str__(self):return 'Person(name=' + self.name + ', age=' + str(self.age) + ')'p = Person('Pankaj', 34)
# __str__() example
print(p) #Person(name=Pankaj, age=34)
# print(p.__str__())#Person(name=Pankaj, age=34)
# s = str(p)
# print(s)#Person(name=Pankaj, age=34)
#
# # __repr__() example
# print(p.__repr__())
# print(type(p.__repr__()))
# print(repr(p))

we mentioned that if we don’t implement str function then the repr function is called. Just comment the str function implementation from Person class and print§ will print {name:Pankaj, age:34}.我們發現,__str__的優先級是大于__repr__的。

4 python 類中的self是是什么

self指的是類實例對象本身(注意:不是類本身)。

5 python3中的__slots__

當一個類需要創建大量實例時,可以通過__slots__聲明實例所需要的屬性,

例如,class Foo(object): slots = [‘foo’]。這樣做帶來以下優點:

  • 更快的屬性訪問速度
  • 減少內存消耗

使用__slots__也是有副作用的:

1. 每個繼承的子類都要重新定義一遍__slots__
2. 實例只能包含哪些在__slots__定義的屬性,這對寫程序的靈活性有影響,比如你由于某個原因新網給instance設置一個新的屬性,比如instance.a = 1, 但是由于a不在__slots__里面就直接報錯了,你得不斷地去修改__slots__或者用其他方法迂回的解決
3. 實例不能有弱引用(weakref)目標,否則要記得把__weakref__放進__slots__

另外參考:https://zhuanlan.zhihu.com/p/25930288

6. __call__方法

一個函數(甚至對象)之所以能執行,關鍵就在于 call() 方法。實際上 x(arg1, arg2,…) 只是 x.call(arg1, arg2, …) 的快捷寫法,因此我們甚至可以為自定義類添加 _call_ 方法,從而使得該類的實例也變成可調用的。例如如下代碼:

# 定義Role類
class Role:def __init__ (self, name):self.name = name# 定義__call__方法def __call__(self):print('執行Role對象')
r = Role('管理員')
# 直接調用Role對象,就是調用該對象的__call__方法
r()# 執行Role對象

上面程序中最后一行代碼使用調用函數的語法來調用對象,這看上去似乎是錯誤的,但由于該 Role 類提供了\ call 方法,因此調用對象的本質就是執行該對象的 _call_ 方法。運行上面代碼,將看到如下輸出結果:

對于程序中的函數,同樣既可使用函數的語法來調用它,也可把函數當成對象,調用它的 call 方法。例如如下示例代碼:

def foo ():print('--foo函數--')
# 下面示范了2種方式調用foo()函數
foo()
foo.__call__()
運行上面代碼,可以看到 foo() 和 foo.__call__() 的效果完全相同。

7. 對象表現形式(bytes)

在 Python 3 中,

  • _repr_、_str_ 和 _format_ 都必須返回 Unicode 字符串(str 類型)。
  • 只有_bytes_ 方法應該返回字節序列(bytes 類型)。

8.str.format()的簡單用法

字段名:省略;數字;變量名

‘name is {}, age is {}’.format(‘peter’,25)
‘name is {1}, age is {0}’.format(25, ‘peter’)
‘name is {name}, age is {age}’.format(name=‘peter’,age=‘25’)

轉換字段: !s !r !a

  • s:傳遞參數之前先對參數調用 str()
  • r:傳遞參數之前先對參數調用 repr()
  • a:傳遞參數之前先對參數調用 ascii()

例子:

class Person:def __init__(self, name, age):self.name = nameself.age = agedef __repr__(self):return 'Person({0.name!r}, {0.age!r})'.format(self)def __str__(self):return '({0.name!s}, {0.age!s})'.format(self)person = Person('peter', 25)
'this person is {!r}'.format(person)
'this person is {!s}'.format(person)
'this person is {!a}'.format('皮特')# result
"this person is Person('peter', 25)"
'this person is (peter, 25)'
"this person is '\\u76ae\\u7279'"

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

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

相關文章

Spring的IOC原理[通俗解釋一下]

1. IoC理論的背景 我們都知道,在采用面向對象方法設計的軟件系統中,它的底層實現都是由N個對象組成的,所有的對象通過彼此的合作,最終實現系統的業務邏輯。 圖1:軟件系統中耦合的對象 如果我們打開機械式手表的后蓋&am…

python爬蟲面試遇到的問題

文章目錄1python基礎1.1 列表生成式和生成器的區別 ?1.2 如何不用任何循環快速篩掉列表中的奇數元素 ?1.3 map和reduce的用法1.4 裝飾器的作用1.5 Python中__new__與__init方法的區別1.6 python中的設計模式1.7 lambda函數,以及它…

ubuntu18 常用命令

文章目錄卸載和安裝卸載和安裝 1.打開一個終端,輸入dpkg --list ,按下Enter鍵,終端輸出以下內容,顯示的是你電腦上安裝的所有軟件。 2.安裝 dpkg –i name.deb 安裝一個 deb 包;在終端上輸入命令sudo apt-get --purge remove 包…

以嵌入式系統設計師考試成績,開始嵌入式博客之旅

http://www.rkb.gov.cn/jsj/cms/s_contents/download/s_dt201003110106.html 轉載于:https://www.cnblogs.com/yueqian-scut/p/3952268.html

SSH框架配置及Maven使用

1.SSH框架配置 1.1. SSH框架介紹 1.2. SSH框架配置 所需資源下載: l jdk; 從Oracle官方網站:http://www.oracle.com/technetwork/cn/java/javase/downloads/index.html下載jdk,win7是默認安裝在C:\Program Files (x86)\Java\jdk1.6.0_25路徑下…

cookie,session的區別和聯系(補充token)

文章目錄1 http為什么是無狀態的2 cookie 和session 的區別詳解3 token參考:備注: 博客文章僅限于學習,禁止商用1 http為什么是無狀態的 2 cookie 和session 的區別詳解 這些都是基礎知識,不過有必要做深入了解。先簡單介紹一下。 二者的定…

庫函數和系統調用的區別

前言 這是一對非常容易混淆的概念。對于用戶( 應用程序開發者 )來說,并不一定要嚴格區分其意義。因為在用戶看來,它們都是以C函數的形式出現的。但了解二者的區別對我們掌握整個計算機系統有很大幫助。 區別 1. 一部分庫函數實現需要使用系統調用( 如 pr…

Flask 從入門到熟悉(不敢稱為精通)

文章目錄2.1 Flask介紹及其安裝2.2 Virtualenv3.1 一個最小的應用3.2 外部課件服務器3.3 調試模式4.1 路由介紹4.2 變量規則4.3 構建URL4.4 HTTP 方法4 總結5.1 靜態文件5.2 渲染模板5.3 練習66.1 接收請求數據6.2 請求對象6.3 文件上傳6.4 Cookies6 總結77.1 重定向和錯誤7.2 …

Ext JS 5 beta版發布

原文:Announcing Public Beta of Ext JS 5我們非常高興的宣布,Sencha Ext JS 5 beta版本開始進行公測了。這個beta版本可以讓你、我們Sencha社區來對我們的Ext JS 5的工作進度進行評測。對于所以Ext JS開發人員,這事一個很好的機會來協助完成…

算法【二分查找】(數組)

1 .山脈數組的巔峰索引 信息 我們把符合下列屬性的數組 A 稱作山脈&#xff1a; A.length > 3 存在 0 < i < A.length - 1 使得A[0] < A[1] < … A[i-1] < A[i] > A[i1] > … > A[A.length - 1] 給定一個確定為山脈的數組&#xff0c;返回任何滿…

關于癌癥的十大謠言

最近&#xff0c;國外網站總結了西方社會中流行的十個關于癌癥的謠言&#xff0c;其中很多謠言在我們周圍也有廣泛的傳播。 謠言1&#xff1a;癌癥是人為導致的現代疾病 或許在公眾的認知里&#xff0c;癌癥在今天要比歷史上任何時期都重要。不過實際上&#xff0c;癌癥可不是一…

[python 進階] 第7章 函數裝飾器和閉包

文章目錄7.1 裝飾器基礎知識7.2 Python何時執行裝飾器7.3 使用裝飾器改進“策略”7.4 變量作用域(global)備注 -比較字節碼&#xff08;暫略&#xff09;7.5 閉包7.6 nonlocal聲明global和nonlocal的區別7.7 實現一個簡單的裝飾器7.8 標準庫中的裝飾器7.8.1 使用functools.lru_…

自制“低奢內”CSS3登入表單,包含JS驗證,請別嫌棄哦。

要求 必備知識 基本了解CSS語法,初步了解CSS3語法知識。和JS/JQuery基本語法。 開發環境 Adobe Dreamweaver CS6 演示地址 演示地址 預覽截圖(抬抬你的鼠標就可以看到演示地址哦): 制作步驟: 一, html結構 <div id"home"><form id"login" class…

class里面只能寫以下5種

轉載于:https://www.cnblogs.com/phplearnings/p/3650849.html

【排序】算法(python實現)

文章目錄python 排序算法1 插入排序1.1 直接插入排序算法思想1.2 希爾排序算法思想2. 選擇排序2.1 簡單選擇排序2.2 堆排序參考python 排序算法 1 插入排序 1.1 直接插入排序 算法思想 直接插入排序的核心思想就是&#xff1a;將數組中的所有元素依次跟前面已經排好的元素相…

OpenSSL漏洞補救辦法詳解(轉)

CVE-2014-0160漏洞背景 2014年4月7日OpenSSL發布了安全公告&#xff0c;在OpenSSL1.0.1版本中存在嚴重漏洞(CVE-2014-0160)。OpenSSL Heartbleed模塊存在一個BUG&#xff0c;問題存在于ssl/dl_both.c文件中的心跳部分&#xff0c;當攻擊者構造一個特殊的數據包&#xff0c;滿足…

SharePoint 自定義WebPart之間的連接

1、創建SharePoint解決方案&#xff0c;添加兩個WebPart分別用來發送和接收&#xff1b; 2、發送值的WebPart需要繼承自IWebPartField(當然&#xff0c;根據需要還可以選擇IWebPartField,IWebPartParameters,IWebPartRow,IWebPartTable&#xff0c;具體參見msdn)&#xff0c;原…

[python 進階] 9. 符合Python風格的對象

文章目錄9.1 對象表示形式9.2 再談向量類9.3 備選構造方法9.4 classmethod與staticmethod9.5 格式化顯示9.6 可散列的Vector2d什么是可散列的數據類型9.6 可散列的Vector9.7 Python的私有屬性和“受保護的”屬性9.8 使用 __slots__ 類屬性節省空間本章包含以下話題&#xff1a;…

android軟件獲取系統簽名

有時候有的功能必須要有系統簽名才能使用&#xff0c;例如調用系統自帶的Surface.screenShot方法時&#xff0c;就必須在androidManifest.xml里聲明android:sharedUserId"android.uid.system" 但是這個時候在編譯生成的apk很有可能無法安裝的情況 并且報這個錯誤&…