A. python面向對象編程中的f.init()什麼意思,為什麼要加這一個
f.init()加在中間是為了類Filter定義一個屬性blocked並初始化,因為它定義了類的屬性blocked,而類Filter的函數filter中要用到這個屬性,所以不加f.init()會報錯.
同樣的s.init(),SPAMFilter子類重寫了Filter父類的init函數,並且重新定義了屬性blocked,而子類SPAMFilter繼承的父類Filter的函數filter中用到了這個屬性,所以不加s.init()也會報錯.
完整的Python程序如下
class Filter:
def init(self):
self.blocked=[]
def filter(self,sequence):
return [x for x in sequence if x not in self.blocked]
class SPAMFilter(Filter):
def init(self):
self.blocked=['SPAM']
f=Filter()
f.init()
print(f.filter([1,2,3]))
s=SPAMFilter()
s.init()
print(s.filter(['SPAM','SPAM','SPAM','SPAM','eggs','bacon','SPAM']))
源代碼(注意源代碼的縮進)
B. Python中「__init__」的意義是什麼
Python中「__init__」的意義是在類實例創建的時候自動會被執行的。這里只是自己重定義了__init__的行為。
C. python中以下語句為什麼會有兩個__init__
這是固定格式 語法要求的,表示初始化的意思
這是固定格式 語法要求的,表示初始化的意思
這是固定格式 語法要求的,表示初始化的意思
D. python中的__init__()是什麼意思呢
python中的__init__()時類的初始化函數,比如:
classObj:
def__init__():
print1
obj=Obj()#這時候調用__init__這個方法
如果解決了您的問題請採納!
如果未解決請繼續追問
E. python中單繼承和多繼承中子類默認繼承父類的哪個構造函數
默認是__init__
【1】python中如果子類有自己的構造函數,不會自動調用父類的構造函數,如果需要用到父類的構造函數,則需要在子類的構造函數中顯式的調用。
【2】如果子類沒有自己的構造函數,則會直接從父類繼承構造函數,這在單繼承(一個子類只從一個父類派生)中沒有任何理解上的問題。
問題:如果是多繼承的情況,一個子類從多個父類派生,而子類又沒有自己的構造函數,則子類默認會繼承哪個父類的構造函數。
【3】子類從多個父類派生,而子類又沒有自己的構造函數時,
(1)按順序繼承,哪個父類在最前面且它又有自己的構造函數,就繼承它的構造函數;
(2)如果最前面第一個父類沒有構造函數,則繼承第2個的構造函數,第2個沒有的話,再往後找,以此類推。
F. python中init方法無法初始化,請大神賜教
首先你要明白類的三大特性,封裝,繼承,多態。你這個主要是封裝得應用。實際圖二也是錯誤的,無法獲得url的值。圖一的稍微改下就對了。
def __init__( self,url):
self. url= url
這樣在對類引用的時候給url賦值就行了
G. Python中關於類的疑問,__init__()的意義是什麼
python哲學里有這么一句:Explicit is better than implicit.明了勝於晦澀。也就是說init更好地說明了是初始化,構造函數,和其他面向對象語言是類似的思路。沒看到哪裡有你說的python是追求簡潔。
class Car(make,model,year)這種寫法已經被繼承關系佔用了
H. python中的__init__(self)是什麼意思呢
Python中,__init__()方法是所謂的對象的「構造函數」,負責在對象初始化時進行一系列的構建操作
假設有如下類:
classworker:
pass
在Python中,對某個類實例進行成員賦值,可以創建不存在的成員:
>>>a=worker()
>>>a.pay=55000
>>>a.name='Bob'
如果對於每一個worker類的實例對象,都要進行如此賦值的話,這個類會變得很難使用
另外,對於用於特殊場合的類,可能要求在對象創建時,進行連接資料庫、連接FTP伺服器、進行API驗證等操作,這些初始化操作,都可以封裝在__init__()方法中進行
__init__方法使用如下規則定義:
classex:
def__init__(self):
pass
__init__方法必須接受至少一個參數即self,Python中,self是指向該對象本身的一個引用,通過在類的內部使用self變數,類中的方法可以訪問自己的成員變數,簡單來說,self.varname的意義為」訪問該對象的varname屬性「
當然,__init__()中可以封裝任意的程序邏輯,這是允許的,__init__()方法還接受任意多個其他參數,允許在初始化時提供一些數據,例如,對於剛剛的worker類,可以這樣寫:
classworker:
def__init__(self,name,pay):
self.name=name
self.pay=pay
這樣,在創建worker類的對象時,必須提供name和pay兩個參數:
>>>b=worker('Jim',5000)
Python會自動調用worker.__init__()方法,並傳遞參數。
通常情況下,self形參由Python自動賦值,但是,在類繼承中,並不是這樣
例如,Python的HTML處理工具HTMLParser,是一個基於OOP模型的工具,要使用該工具,必須編寫一個類,繼承html.parser.HTMLParser類,並重載一系列方法,以定製自己的功能
fromhtml.parser.HTMLParser
classex2(HTMLParser):
def__init__(self):
HTMLParser.__init__(self)
此處,需要調用了HTMLParser類的__init__方法,而且,此處手動給HTMLParser.__init__()方法的self形參賦值,事實上,如果不顯式指定self形參的值,Python不會在此處自動為HTMLParser.__init__()方法的self形參進行賦值
如此設計的原因是,在子類中需要獲得超類的成員和方法,而通過在子類的__init__方法中調用超類的__init__方法,並手動給它傳遞指向子類的self值,可以使超類的__init__方法將所初始化的變數設置成子類的變數,這樣,就可以在子類中直接訪問超類的變數了。
I. Python中的init.py有什麼作用
你指的應該是是__init__.py文件,以下下詳細解釋:
__init__.py該文件的作用就是相當於把自身整個文件夾當作一個包來管理,每當有外部import的時候,就會自動執行裡面的函數。
它具有以下幾個作用:
1. 標識該目錄是一個python的模塊包(mole package)
如果你是使用python的相關IDE來進行開發,那麼如果目錄中存在該文件,該目錄就會被識別為 mole package 。
2. 簡化模塊導入操作
假設我們的模塊包的目錄結構如下:
.
└── mypackage
├── subpackage_1
│ ├── test11.py
│ └── test12.py
├── subpackage_2
│ ├── test21.py
│ └── test22.py
└── subpackage_3
├── test31.py
└── test32.py
如果我們使用最直接的導入方式,將整個文件拷貝到工程目錄下,然後直接導入:
from mypackage.subpackage_1 import test11
from mypackage.subpackage_1 import test12
from mypackage.subpackage_2 import test21
from mypackage.subpackage_2 import test22
from mypackage.subpackage_3 import test31
from mypackage.subpackage_3 import test32
這樣的話,看起來就會很麻煩,查找的時候也會麻煩,此時__init__.py就起到了簡化的作用。
2.1init.py 是怎麼工作的?
實際上,如果目錄中包含了__init__.py時,當用 import 導入該目錄時,會執行__init__.py裡面的代碼。我們在mypackage目錄下增加一個__ init __.py文件來做一個實驗:
.
└── mypackage
├── __init__.py
├── subpackage_1
│ ├── test11.py
│ └── test12.py
├── subpackage_2
│ ├── test21.py
│ └── test22.py
└── subpackage_3
├── test31.py
└── test32.py
mypackage/__init__.py裡面加一個print,如果執行了該文件就會輸出
print("You have imported mypackage")
下面直接用交互模式進行 import
>>> import mypackage
You have imported mypackage
很顯然,__init__.py在包被導入時會被執行。
2.2 控制模塊導入
我們再做一個實驗,在 mypackage/init.py 添加以下語句:
from subpackage_1 import test11
我們導入 mypackage 試試:
>>> import mypackageTraceback (most recent call last):
File "<stdin>", line 1, in <mole>
File "/home/taopeng/Workspace/Test/mypackage/__init__.py", line 2, in <mole>
from subpackage_1 import test11ImportError: No mole named 'subpackage_1'
報錯了。。。怎麼回事?
原來,在我們執行import時,當前目錄是不會變的(就算是執行子目錄的文件),還是需要完整的包名。
from mypackage.subpackage_1 import test11
綜上,我們可以在init.py 指定默認需要導入的模塊
2.3 偷懶的導入方法
有時候我們在做導入時會偷懶,將包中的所有內容導入
from mypackage import *
這是怎麼實現的呢?__all__變數就是干這個工作的。
__all__關聯了一個模塊列表,當執行from xx import *時,就會導入列表中的模塊。我們將__init__.py修改為 :
__all__ = ['subpackage_1', 'subpackage_2']
這里沒有包含subpackage_3,是為了證明__all__起作用了,而不是導入了所有子目錄。
>>> from mypackage import *
>>> dir()['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'subpackage_1', 'subpackage_2']
>>>
>>> dir(subpackage_1)['__doc__', '__loader__', '__name__', '__package__', '__path__', '__spec__']
子目錄的中的模塊沒有導入!!!
該例子中的導入等價於:from mypackage import subpackage_1, subpackage_2
因此,導入操作會繼續查找 subpackage_1 和 subpackage_2 中的__init__.py並執行。(但是此時不會執行 import *)
我們在 subpackage_1 下添加__init__.py文件:
__all__ = ['test11', 'test12']# 默認只導入test11
from mypackage.subpackage_1 import test11
再來導入試試
>>> from mypackage import *
>>> dir()['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'subpackage_1', 'subpackage_2']
>>>
>>> dir(subpackage_1)['__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'test11']
如果想要導入子包的所有模塊,則需要更精確指定。
>>> from mypackage.subpackage_1 import *
>>> dir()['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'test11', 'test12']
3. 配置模塊的初始化操作
在了解了__init__.py的工作原理後,應該能理解該文件就是一個正常的python代碼文件。
因此可以將初始化代碼放入該文件中。
J. python裡面 init的用法
類的構造函數,用於初始化類成員等,只能用__init__
,不能換其他名字
設有個類myclass,
相當於c++,java裡面的
myclass()