娛樂城原題目:若何懂得 Python 中的面向工具編程? 現往常面向工具編程的使用特別很是普遍,本文咱們就來切磋一下Python中的面向工具編程。 作者 | Radek Fabisiak 譯者 | 彎月,責編 | 郭芮 如下為譯文: Python支撐多品種型的編程范式,例如進程式編程、函數式編程、面向工具編程,並且還可以融會多品種型的范式。 現往常面向工具編程的使用特別很是普遍。面向工具編程的根本元素是工具,其包括的數據成員稱為屬性,函數(例程、進程)稱為要領。 工具是類的實例。換句話說,類首要界說工具的佈局,然后咱們以類為模板創立工具。類不只包括要領界說,並且還包括一切實例同享的數據。 本文咱們來切磋一下Python中的面向工具編程。咱們將演示若何創立類,并使用類來實例化工具。本文的首要內容以下: 創立Python類 數據屬性 實例要領 屬性 類以及動態要領 承繼 本文沒法涵蓋這些主題的一切具體信息。Python中的面向工具編程還包括其餘許多方面。但願本文可以或許為你進修Python及完成面向工具供應一個優秀的劈頭。 創立Python類 咱們可以使用樞紐字class界說Python類,樞紐字后面緊跟類的稱號、分號以及類的完成: >>> classMyClass: … pass … 按照常規,Python類的定名采用首字母大寫(即PascalCase)。 目前讓咱們創立這個新類的一個實例,名為MyClass: >>> a = MyClass >>> a 語句a = MyClass創立了MyClass的一個實例,并將它的引用賦值給變量a。 咱們可以經由過程Python內置的函數type或者間接經由過程屬性.__class__來獵取類型(即工具的類)。在拿到類(類型)之后,咱們就可以行使屬性.__ name__獵取類的名字: >>> type(a) >>> a.__class_ _ >>> a.__class_ _.__name_ _ ‘MyClass’ 趁便提一句,Python類也是工具。它們是type的實例: >>> type(MyClass) 上面,咱們來界說一個要領。 Python中每個實例要領的第一個參數必需對應于該實例,即該工具自身。按照常規,這個參數名為self。后面是其餘參數(若是有必要的話)。在挪用要領時,咱們無需明確供應與參數self相對於應的參數。 平日,咱們必要界說的一個最緊張的要領是.__init__。在類的實例創立后就會挪用這個要領。該要領擔任初始化類成員。咱們界說的.__init__以下: >>> classMyClass: … def__init__(self, arg_1, arg_2, arg_3): … print( f’an instance of created’) … print( f’arg_1: , arg_2: , arg_3: ‘) … 上面,咱們來創立一個MyClass實例,望望這個初始化要領的詳細事情。咱們的.__init__要領必要三個參數(arg_一、arg_2以及arg_3),記住咱們不必要傳遞與self對應的第一個參數。以是,在實例化工具時,咱們必要傳遞三個參數: >>> a = MyClass( 2, 4, 8) an instance ofMyClasscreated arg_1: 2, arg_2: 4, arg_3: 8 上述聲明發生的效果以下: 創立一個MyClass類型的工具的實例。 主動挪用該實例的要領.__init__。 咱們傳遞給MyClass要領的參數:(2,4以及8)會被傳遞給.__init__。 .__init__履行咱們的哀求,并輸入效果。它行使type(self).__name__獵取類的稱號。 目前咱們失去了一個類,它有一個要領.__init__,和這個類的一個實例。 數據屬性 上面咱們來點竄MyClass,增長一些數據屬性。 咱們行使.百家樂 娛樂城__init__初始化以及界說了實例,咱們還可以在這個要領或者其餘實例要領中,經由過程給某個數據屬性賦值的方式改變屬性值: >>> classMyClass: … def__init__(self, arg_1, arg_2, arg_3): … self.x = arg_1 … self._y = arg娛樂城評價_2 … self.__z = arg_3 … 目前MyClass有三個數據屬性: .x可以獵取arg_1的值 ._y可以獵取arg_2的值 .__ z可以獵取arg_3的值 咱們可以行使Python的解包機制,用更緊湊的情勢編寫這段代碼: >>> classMyClass: … def__init__(self, arg_1, arg_2, arg_3): … self.x, self._y, self.__z = arg_1, arg_2, arg_3 … 屬性稱號中的下劃線(_)是為了註解這些屬性是“公有”屬性: 開首沒有下劃線的屬性(譬如.x)平日可供工具內部的挪用以及點竄。 開首領有一個下劃線的屬性(譬如._y)平日也能夠從工具內部挪用以及點竄。然而,下劃線是一種習用的標志,即該類的創立者猛烈倡議不要使用該變量。應當僅經由過程類的功效成員(譬如要領以及屬性)挪用以及點竄該變量。 開首領有雙下劃線的屬性(譬如.__ z)將在名字潤色進程中被更名(在本例中它將被更名為._MyClass__z)。你也能夠經由過程這個新稱號從工具內部挪用以及點竄它們。然則,我猛烈否決這類做法。應當絕經由過程類的功效成員以其原始稱號進行挪用以及點竄。 Python工具的數據屬性平日存儲在名為.__ dict__的字典中,它也是工具的屬性之一。然則,你也能夠將數據屬性存儲在其餘處所。咱們可以間接走訪__dict__,或者行使Python的內置函數vars獵取.__ dict__: >>> a = MyClass( 2, 4, 8) >>> vars(a) { ‘x’: 2, ‘_y’: 4, ‘_MyClass__z’: 8} >>> a.__dict_ _ { ‘x’: 2, ‘_y’: 4, ‘_MyClass__z’: 8} 名字潤色進程把鍵’__z’釀成了’_MyClass__z’。 咱們可以把.__ dict__當成平凡的Python字典使用。 獵取以及點竄與數據屬性聯繫關係的值的慣例要領以下: >>> a.x 2 >>> a._y 4 >>> a.__z Traceback (most recent call last): File “大眾”大眾, line 1, in AttributeError:’MyClass’object has no attribute ‘__z’ >>> a.x = 16 >>> a.x 16 >>> vars(a) { ‘x’: 16, ‘_y’: 4, ‘_MyClass__z’: 8} 請注重,咱們沒法走訪.__ z,由於.__ dict__沒有鍵’__z’。 實例要領 上面,咱們來創立兩個實例要領: ●.set_z:點竄.__ z。 ●.get_z:返歸.__ z的值。 請記住,每個實例要領的第一個參數(按照商定名為self)引用工具自身,但咱們無需在挪用要領時指定這個參數: >>> classMyClass: … def__init__(self, arg_1, arg_2, arg_3): … self.x, self._y, self.__z = arg_1, arg_2, arg_3 … … defset_z(self, value): … self.__z = value … … defget_z(self): … returnself.__z … >>> b = MyClass( 2, 4, 8) 要領.get_z以及.set_z供應了傳統的檢索以及點竄.__ z值的要領: >>> b.get_z 8 >>> b.set_z( 16) >>> vars(b) { ‘x’: 2, ‘_y’: 4, ‘_MyClass__z’: 16} 你也能夠在.get_z以及.set_z中增添其餘功效,例如反省數據的有用性。這類要領完成了面向工具編程中的一個首要觀點:封裝。 屬性 還有一種要領(一種更Python的方式)走訪以及點竄數據屬性是使用屬性。屬性封裝了一系列要領:getter、setter以及deleter,但其舉動與平凡的數據屬性雷同。 上面的代碼完成了屬性.z,個中還包括.get_z以及.set_z的功效: >>> classMyClass: … def__init__(self, arg_1, arg_2, arg_3): … self.x, self._y, self.__z = arg_1, arg_2, arg_3 … … @property … defz(self): … returnself.__z … … @z.setter … defz(self, value): … self.__z = value … >>> b = MyClass( 2, 4, 8) 以下,咱們行使響應的屬性.z來走訪以及點竄數據屬性.__ z:博弈娛樂城 >>> b.z 8 >>> b.z = 16 >>> vars(b) { ‘x’: 2, ‘_y’: 4, ‘_MyClass__z’: 16} 這段代碼比上述示例更精簡優雅。 類與動態要領 除了實例要領以及屬性以外,類還可以領有類要領以及動態要領。 上面讓咱們為MyClass增添三個要領: >>> classMyClass: … def__init__(self, arg_1, arg_2, arg_3): … self.x, self._y, self.__z = arg_1, arg_2, arg_3 … … deff(self, arg): … print( ‘instance method f called’) … print( f’instance: ‘) … print( f’instance attributes:n’) … print( f’class: ‘) … print( f’arg: ‘) … … @classmethod … defg(cls, arg): … print( ‘class method g called’) … print( f’cls: ‘) … print( f’arg: ‘) … … @staticmethod … defh(arg): … print( ‘static method h called’) … print( f’arg: ‘) … >>> c = MyClass( 2, 4, 8) 要領.f是一個實例要領。實例要領的第一個參數是工具自身的引用。這些要領可以行使self走訪工具,行使vars(self)或者self.__dict__走訪工具的數據屬性,還可以行使type(self)或者self.__class__走訪工具對應的類,並且它們還可以領有本人的參數。 要領.g的開首包括潤色器@classmethod,註解這是一個類要領。每個類要領的第一個參數都邑指向類自身,按照商定該參數名為cls。與實例要領的環境同樣,咱們不必要明確供應與cls對應的參數。而類要領可以行使cls以及本人的參數走訪類自身。 要領.h的開首包括潤色器@staticmethod,註解這是一個動態要領。動態要領只能走訪本人的參數。 Python中常見的挪用實例要領的要領以下: >>> c.f( ‘my-argument’) instance method f called instance: instance attributes: { ‘x’: 2, ‘_y’: 4, ‘_MyClass__z’: 8} class: arg:my-argument 平日,咱們應當間接經由過程類(而不是實例)挪用類要領以及動態要領: >>> MyClass.g( ‘my-argument’) classmethodgcalled cls: arg:my-argument >>> MyClass.h( ‘my-argument’) static method h called arg:my-argument 請記住,咱們不必要傳遞類要領的第一個參數:與cls相對於應的參數。 然則,咱們可以像上面如許挪用類要領以及動態要領: >>> c.g( ‘my-argument’) classmethodgcalled cls: arg:my-argument >>> c.h( ‘my-argument’) static method h called arg:my-a手機 娛樂城rgument 當咱們挪用c.g或者c.h,但實例成員沒有如許的稱號時,Python會搜刮類以及動態成員。 承繼 承繼是面向工具編程的另一個緊張特徵。在這個觀點中,類(稱為子類或者派生類)會承繼其餘類(稱為超類或者基類)的數據以及函數成員。 在Python中,一切類都邑默許承繼Python自帶的類工具。然則,咱們可以依據必要界說合適的類承繼條理佈局。 例如,咱們可以創立一個名為MyOtherClass的新類,該類承繼了MyClass: >>> classMyOtherClass(MyClass): … def__init__(self, u, v, w, x, y, z): … super.__init__(x, y, z) … self.__u, self.__v, self.__w = u, v, w … … deff_(self, arg): … print( ‘instance method f_ called’) … print( f’instance: ‘) … print( f’instance attributes:n’) … print( f’class: ‘) … print( f’arg: ‘) … >>> d = MyOtherClass( 1, 2, 4, 8, 16, 32) 如上,MyOtherClass領有MyClass的成員:.x、._y、.__z和.f。你可以經由過程語句super.__init__(x, y, z)初始化基類的數據成員x、._y以及.__z,該語句會挪用基類的.__init__要領。 除此以外,MyOtherClass還有本人的成員:.__u、.__v、.__w以及.f_。 上面,咱們經由過程vars獵取數據成員: >>> vars(d) { ‘x’: 8, ‘_y’: 16, ‘_MyClass__z’: 32, ‘_MyOtherClass__u’: 1, ‘_MyOtherClass__v’: 2, ‘_MyOtherClass__w’: 4} 咱們可以挪用基類以及派生類中的一切要領: >>> d.f( ‘som娛樂城 玩運彩e-argument’) instance method f called instance: instance attributes: { ‘x’: 8, ‘_y’: 16, ‘_MyClass__z’: 32, ‘_MyOtherClass__u’: 1, ‘_MyOtherClass__v’: 2, ‘_MyOtherClass__w’: 4} class: arg:some-argument >>> d.f _( ‘some-argument’) instance method f _called instance: instance attributes: { ‘x’: 8, ‘_y’: 16, ‘_MyClass__z’: 32, ‘_MyOtherClass__u’: 1, ‘_MyOtherClass__v’: 2, ‘_MyOtherClass__w’: 4} class: arg:some-argument 然則,若是派生類包括的某個成員與基類同名,則優先使用派生類的成員。 總結 面向工具編程是Python支撐的編程范式之一。面向工具蘊含的形象和表征的實際世界舉動在某些時辰會特別很是有輔助性。然而,偶然也可能會違背直覺,并為開發進程帶來無須要的貧苦。 在本文中,咱們先容了若何行使Python編寫根本的面向工具法式。Python中還有許多類以及面向工具的功效,例如: 要領:.__repr__以及.__str__ 要領:.__new__ 操作符 要領:.__getattribute__、.__getattr__、.__setattr__以及.__delattr__ 天生器 可挪用性 創立序列 描寫器 上下文治理 形象類以及成員 多重承繼 使用super 拷貝 序列化 slot 類潤色器 數據類 等等…… 現往常面向工具黑白常流行的編程方式。若是你立志做一位Python開發職員,那么就應當進修面向工具編程。但請不要忘掉,Python還支撐其餘編程范式,例如進程式編程、函數式編程等,在某些環境下大概選用這些范例更為合適。 絕情享用編程的快活! 原文:https://www.blog.duomly.com/object-oriented-programming-in-python/ 本文為 CSDN 翻譯,轉載請注明泉源出處。 阿里云邊沿計算三年,都為開發者帶來了什么? ☞@法式員,第一份事情薪資不緊張?
娛樂城-如何理解 Python 中的面向對象編程?-娛樂城註冊
2024-01-07
Previous Post: 娛樂城-你在酒桌上臉紅脖子粗,有的人在家喝杯可樂就醉了-娛樂城註冊
Next Post: 娛樂城-臨沂市第十二屆“勞動之星”營養健康行業技能競賽成功舉辦-娛樂城註冊