init

類別中的__init__方法,相當於Java與C++建構子。

語法

def __init__(self, 參數1, 參數2, 參數3):
	程式碼

第一個參數為self,一定要存在。 參數可以0個到多個。

沒有參數的init方法

使用類別名()建立物件時,就會呼叫__init__(self)
會隱藏的代入self參數,self參數就是物件的記憶體位址。

以下程式碼呼叫Cat(),就會呼叫__init__(self)方法。

1
2
3
4
5
6
class Cat:
    def __init__(self):
        print("init")


cat1 = Cat()
init

自動產生init方法

__init__(self)方法若沒手動寫,也會自動產生。

有參數的init方法

呼叫類別名(參數),就會自動把參數代入__init__(self, 參數)方法。

1
2
3
4
5
6
7
class Cat:
    def __init__(self, name, age):
        print(f"name = {name}, age = {age}")


cat1 = Cat("小白", 5)
cat2 = Cat("小黑", 10)
name = 小白, age = 5
name = 小黑, age = 10

一個類別只有一個init方法,多個init只有最後一個生效

以下程式碼有二個init方法,但只有最後一個生效,試圖使用二個參數,會產生錯誤訊息,內容為:你給了3個參數(包含隱藏的self參數),但實際上只要給二個參數(包含隱藏的self參數)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Person:
    name = None
    age = None

    def __init__(self, name, age):
        self.name = name
        self.age = age
        print("come here 1")

    def __init__(self, name):
        self.name = name
        print("come here 2")

p = Person("John", 20)
    p = Person("John", 20)
        ^^^^^^^^^^^^^^^^^^
TypeError: Person.__init__() takes 2 positional arguments but 3 were given

自動產生成員變數

以下程式碼沒有成員變數 name 與 age ,在 init 方法使用self.成員變數 = 參數,就會自動產生成員變數。

1
2
3
4
5
6
7
8
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age


p2 = Person("Mary", 20)
print(f"p2 name = {p2.name} , age= {p2.age} ")
p2 name = Mary , age= 20

init使用可變參數

使用可變參數就可以實現多個建構子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Person:
    name = None
    age = None

    def __init__(self, *args):
        if len(args) == 1:
            self.name = args[0]
        elif len(args) == 2:
            self.name = args[0]
            self.age = args[1]

p1 = Person("John")
print(f"p1 name = {p1.name} , age= {p1.age} ")

p2 = Person("Mary", 20)
print(f"p2 name = {p2.name} , age= {p2.age} ")
p1 name = John , age= None 
p2 name = Mary , age= 20 

init不能return 傳回值

以下程式碼執行時會有錯誤。

1
2
3
4
5
6
7
8
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        return "abcd"

p2 = Person("Mary", 20)
print(f"p2 name = {p2.name} , age= {p2.age} ")
    p2 = Person("Mary", 20)
         ^^^^^^^^^^^^^^^^^^
TypeError: __init__() should return None, not 'str'

results matching ""

    No results matching ""