欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳細(xì)解讀Python中的__init__()方法

 更新時間:2015年05月02日 11:57:33   作者:young_ipython  
這篇文章主要介紹了Python中的__init__()方法,__init__()方法是Python學(xué)習(xí)當(dāng)中重要的基礎(chǔ)知識,需要的朋友可以參考下

__init__()方法意義重大的原因有兩個。第一個原因是在對象生命周期中初始化是最重要的一步;每個對象必須正確初始化后才能正常工作。第二個原因是__init__()參數(shù)值可以有多種形式。

因為有很多種方式為__init__()提供參數(shù)值,對于對象創(chuàng)建有大量的用例,我們可以看看其中的幾個。我們想盡可能的弄清楚,因此我們需要定義一個初始化來正確的描述問題區(qū)域。

在我們接觸__init__()方法之前,無論如何,我們都需要粗略、簡單地看看在Python中隱含的object類的層次結(jié)構(gòu)。

在這一章,我們看看不同形式的簡單對象的初始化(例如:打牌)。在這之后,我們還可以看看更復(fù)雜的對象,就像包含集合的hands對象以及包含策略和狀態(tài)的players。
隱含的超類——object

每一個Python類都隱含了一個超類:object。它是一個非常簡單的類定義,幾乎不做任何事情。我們可以創(chuàng)建object的實例,但是我們不能用它做太多,因為許多特殊的方法容易拋出異常。

當(dāng)我們自定義一個類,object則為超類。下面是一個類定義示例,它使用新的名稱簡單的繼承了object:

class X:
  pass

下面是和自定義類的一些交互:

>>> X.__class__
<class 'type'>
>>> X.__class__.__base__
<class 'object'>

我們可以看到該類是type類的一個對象,且它的基類為object。

就像在每個方法中看到的那樣,我們也看看從object繼承的默認(rèn)行為。在某些情況下,超類特殊方法的行為是我們所想要的。在其他情況下,我們需要覆蓋這個特殊方法。
基類對象的init()方法

對象生命周期的基礎(chǔ)是創(chuàng)建、初始化和銷毀。我們將創(chuàng)建和銷毀的高級特殊方法推遲到后面的章節(jié)中,目前只關(guān)注初始化。

所有類的超類object,有一個默認(rèn)包含pass的__init__()實現(xiàn),我們不需要去實現(xiàn)__init__()。如果不實現(xiàn)它,則在對象創(chuàng)建后就不會創(chuàng)建實例變量。在某些情況下,這種默認(rèn)行為是可以接受的。

我們總是給對象添加屬性,該對象為基類object的子類。思考以下類,需要兩個實例變量但不初始化它們:

class Rectangle:
  def area(self):
    return self.length * self.width

Rectangle類有一個使用兩個屬性來返回一個值的方法。這些屬性沒有初始化。這是合法的Python代碼。它可以有效的避免專門設(shè)置屬性,雖然感覺有點奇怪,但是有效。

下面是于Rectangle類的交互:

>>> r = Rectangle()
>>> r.length, r.width = 13, 8
>>> r.area()
104

顯然這是合法的,但也是容易混淆的根源,所以也是我們需要避免的原因。

無論如何,這個設(shè)計給予了很大的靈活性,這樣有時候我們不用在__init__()方法中設(shè)置所有屬性。至此我們走的很順利。一個可選屬性其實就是一個子類,只是沒有真正的正式聲明為子類。我們創(chuàng)建多態(tài)在某種程度上可能會引起混亂以及if語句的不恰當(dāng)使用所造成的盤繞。雖然未初始化的屬性可能是有用的,但很有可能是糟糕設(shè)計的前兆。

《Python之禪》中的建議:

    "顯式比隱式更好。"

一個__init__()方法應(yīng)該讓實例變量顯式。

可憐的多態(tài)

靈活和愚蠢就在一念之間。

當(dāng)我們覺得需要像下面這樣寫的時候,我們正從靈活的邊緣走向愚蠢:

if 'x' in self.__dict__:

或者:

try:
  self.x
except AttributeError:

是時候重新考慮API并添加一個通用的方法或?qū)傩浴V貥?gòu)比添加if語句更明智。
在超類中實現(xiàn)init()

我們通過實現(xiàn)__init__()方法來初始化對象。當(dāng)一個對象被創(chuàng)建,Python首先創(chuàng)建一個空對象,然后為那個新對象調(diào)用__init__()方法。這個方法函數(shù)通常用來創(chuàng)建對象的實例變量并執(zhí)行任何其他一次性處理。

下面是Card類示例定義的層次結(jié)構(gòu)。我們將定義Card超類和三個子類,這三個子類是Card的變種。兩個實例變量直接由參數(shù)值設(shè)置,兩個變量通過初始化方法計算:

class Card:
  def __init__(self, rank, suit):
    self.suit = suit
    self.rank = rank
    self.hard, self.soft = self._points()

class NumberCard(Card):
  def _points(self):
    return int(self.rank), int(self.rank)

class AceCard(Card):
  def _points(self):
    return 1, 11

class FaceCard(Card):
  def _points(self):
    return 10, 10

在這個示例中,我們提取__init__()方法到超類,這樣在Card超類中的通用初始化可以適用于三個子類NumberCard、AceCard和FaceCard。

這是一種常見的多態(tài)設(shè)計。每一個子類都提供一個唯一的_points()方法實現(xiàn)。所有子類都有相同的簽名:有相同的方法和屬性。這三個子類的對象在一個應(yīng)用程序中可以交替使用。

如果我們?yōu)榛ㄉ褂煤唵蔚淖址?,我們可以?chuàng)建Card實例,如下所示:

cards = [AceCard('A', '?'), NumberCard('2','?'), NumberCard('3','?'),]

我們在列表中枚舉出一些牌的類、牌值和花色。從長遠(yuǎn)來說,我們需要更智能的工廠函數(shù)來創(chuàng)建Card實例;用這個方法枚舉52張牌無聊且容易出錯。在我們接觸工廠函數(shù)之前,我們看一些其他問題。
使用init()創(chuàng)建顯式常量

可以給牌定義花色類。在二十一點中,花色無關(guān)緊要,簡單的字符串就可以。

我們使用花色構(gòu)造函數(shù)作為創(chuàng)建常量對象的示例。在許多情況下,我們應(yīng)用中小部分對象可以通過常量集合來定義。小部分的靜態(tài)對象可能是實現(xiàn)策略模式或狀態(tài)模式的一部分。

在某些情況下,我們會有一個在初始化或配置文件中創(chuàng)建的常量對象池,或者我們可以基于命令行參數(shù)創(chuàng)建常量對象。我們會在第十六章《通過命令進(jìn)行復(fù)制》中獲取初始化設(shè)計和啟動設(shè)計的詳細(xì)信息。

Python沒有簡單正式的機(jī)制來定義一個不可變對象,我們將在第三章《屬性訪問、方法屬性和描述符》看看保證不可變性的相關(guān)技術(shù)。在本示例中,花色不可變是有道理的。

下面這個類,我們將用于創(chuàng)建四個顯式常量:

class Suit:
  def __init__(self, name, symbol):
    self.name= name
    self.symbol= symbol

下面是通過這個類創(chuàng)建的常量:

Club, Diamond, Heart, Spade = Suit('Club','?'), Suit('Diamond','?'), Suit('Heart','?'), Suit('Spade','?')

現(xiàn)在我們可以通過下面展示的代碼片段創(chuàng)建cards:

cards = [AceCard('A', Spade), NumberCard('2', Spade), NumberCard('3', Spade),]

這個小示例,這種方法對于單個特性的花色代碼來說并不是一個巨大的進(jìn)步。在更復(fù)雜的情況下,會有一些策略或狀態(tài)對象通過這個方式創(chuàng)建。通過從小的、靜態(tài)的常量對象中復(fù)用可以使策略或狀態(tài)設(shè)計模式更有效率。

我們必須承認(rèn),在Python中這些對象并不是技術(shù)上一成不變的,它是可變的。進(jìn)行額外的編碼使得這些對象真正不變可能會有一些好處。

無關(guān)緊要的不變性

不變性很有吸引力但卻容易帶來麻煩。有時候被神話般的“惡意程序員”在他們的應(yīng)用程序中通過修改常量值進(jìn)行調(diào)整。從設(shè)計上考慮,這是非常愚蠢的。這些神話般的、惡意的程序員不會停止這樣做,因為已經(jīng)沒有更好的方法去更簡潔簡單的在Python中編碼。惡意程序員訪問到源碼并且修改它僅僅是希望盡可能輕松地編寫代碼來修改一個常數(shù)。

在定義不可變對象的類的時候最好不要掙扎太久。在第三章《屬性訪問、方法屬性和描述符》中,我們將通過在有bug的程序中提供合適的診斷信息來展示如何實現(xiàn)不變性。

相關(guān)文章

  • Python實現(xiàn)簡易計算器的示例代碼

    Python實現(xiàn)簡易計算器的示例代碼

    Tkinter作為 Python GUI 開發(fā)工具之一,它具有 GUI 軟件包的必備的常用功能。本文就將利用Tkinter編寫簡易的計算器,感興趣的可以了解一下
    2022-11-11
  • Python中class內(nèi)置方法__init__與__new__作用與區(qū)別解析

    Python中class內(nèi)置方法__init__與__new__作用與區(qū)別解析

    這篇文章主要介紹了Python中class內(nèi)置方法__init__與__new__作用與區(qū)別探究,本文中涉及的類均為Python3中默認(rèn)的新式類,對應(yīng)Python2中則為顯式繼承了object的class,因為未繼承object基類的舊式類并沒有這些內(nèi)置方法,需要的朋友可以參考下
    2022-09-09
  • Python列表計數(shù)及插入實例

    Python列表計數(shù)及插入實例

    這篇文章主要介紹了Python列表計數(shù)及插入的用法,以實例形式對列表的計數(shù)與插入用法做了較為詳細(xì)的分析,需要的朋友可以參考下
    2014-12-12
  • Python MySQLdb 執(zhí)行sql語句時的參數(shù)傳遞方式

    Python MySQLdb 執(zhí)行sql語句時的參數(shù)傳遞方式

    這篇文章主要介紹了Python MySQLdb 執(zhí)行sql語句時的參數(shù)傳遞方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • python Crypto模塊的安裝與使用方法

    python Crypto模塊的安裝與使用方法

    本篇文章主要介紹了python Crypto模塊的安裝與使用方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-12-12
  • python入門教程之基本算術(shù)運算符

    python入門教程之基本算術(shù)運算符

    這篇文章主要給大家介紹了關(guān)于python入門教程之基本算術(shù)運算符的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • python算法表示概念掃盲教程

    python算法表示概念掃盲教程

    這篇文章主要為大家詳細(xì)介紹了python算法表示概念掃盲教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • Python3 使用pip安裝git并獲取Yahoo金融數(shù)據(jù)的操作

    Python3 使用pip安裝git并獲取Yahoo金融數(shù)據(jù)的操作

    這篇文章主要介紹了Python3 使用pip安裝git并獲取Yahoo金融數(shù)據(jù)的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Pytorch?autograd與邏輯回歸的實現(xiàn)詳解

    Pytorch?autograd與邏輯回歸的實現(xiàn)詳解

    這篇文章主要為大家介紹了Pytorch?autograd與邏輯回歸的實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Python 執(zhí)行矩陣與線性代數(shù)運算

    Python 執(zhí)行矩陣與線性代數(shù)運算

    這篇文章主要介紹了Python 執(zhí)行矩陣與線性代數(shù)運算,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-08-08

最新評論