python3的類:
python是一門面向對象的編程語言,學習python下的類,,能幫助自己形成一個基本的面向對象的概念。關於類和實例的理解,一個易懂的栗子就是動物類,我們把動物看做一個類,而狗啊,貓啊,鼠啊的就是這個類的實例。你也完全可以把自己定義的類看成是一個自定義的數據類型,想int、str、list一樣,不一樣的是這個自定義的數據類型中有一些我們自己編寫的功能方法,每一個聲明的實例都可以直接調用這里面的方法。
類的屬性:
簡單的說,類的屬性就是在類中定義的變量。而所有的實例,都具有這么一個或多個屬性。比如上面的動物類實例狗、貓、鼠。它們都有四只腳、一直尾巴。這就稱為屬性。屬性的引用和和使用,用(.)
class Animal(object):
x = 4 #代表實例的腳
y = 1 #代表實例的尾巴
dog = Animal()
cat = Animal()
mouse = Animal()
print("狗的腳數:%d" % dog.x)
print("貓的腳數:%d" % cat.x)
print("鼠的尾巴數:%d" % mouse.y)
運行結果如下:

類的方法:
__init__方法:
類中離不開實現各種功能的方法,而在定義類后,大部分都會先重寫一下__init__方法,它規定了在創建實例時必須傳入的一些參數。
class Test1(object): #類的定義
def __init__(self, name, salary): #規定在聲明實例時必須傳入name、salary這兩個參數
self.name = name
self.salary = salary
def print_f(self): #類的print_f方法
print("姓名:%s" % self.name)
print("分數:%d" % self.salary)
test1 = Test1("shangsan", 59) #聲明一個類的實例,同時傳入兩個必須的參數,如果參數不夠的話,會報錯。
test1.print_f() #調用這個實例中的print_f方法
其實你也可以不重寫__init__方法,直接把參數放在需要使用的方法中,只是在調用時稍微有點不一樣,不需要在參數名前加“self.”,改一下上面的代碼:
class Test2(object): #繼承object類,后面會說道
def print_f(self, name, salary): #去掉__init__方法,直接把參數放在方法中
print("姓名:%s" % name)
print("分數:%d" % salary) #在格式化時,若前面用%d,則必須傳入整形
test2 = Test2() #聲明實例時不再傳入參數,而是在下面調用這個方法時傳入所需要的參數。
test2.print_f("lisi", 59) #調用print_f方法
自定義方法:
在類中自定義方法和在外面是一樣的,只不過在后面的參數中會多一個self,但這個參數我們是不需要傳入的,所在我們完全可以就像在類外那樣進行編寫。至於這個self,它代表的是類的實例。方法的調用,可以用(.)來進行調用
上面兩端代碼中的print_f方法就是我們自定義的方法,他的功能是輸出name和salary,我們調用時,只需要在實例后面加個(.)然后選擇這個方法就可以了
類的繼承:
訪問父類的屬性和方法
類的繼承,就是我們在創建一個類時,它可以繼承另一個類的屬性和方法。新創建的這個類交子類、做繼承的類交父類。比如我們先創建了一個animal類,有創建了一個dog類並繼承animal類,那animal就是父類,dog就是子類
如果我們想要繼承某個類,只需要在創建子類時,在后面的()中填入父類的類名就可以了,如果不需要成其他類,則填入object就行,這是所有類的父類,看下下面的代碼
class People(object): #創建父類,繼承object類
def __init__(self, name, age): #必須傳入name和age
self.name = name
self.age = age
def prient_f(self):
print("i am {0},i am {1} years old!!".format(self.name, self.age))
class Student(People): #創建子類,繼承People這個父類
pass
a = Student("zhangsan", 12) #因為是繼承,所以也要傳入參數
print("我是子類,我要訪問父類的name屬性 %s" % a.name)
print("我是子類,下面是我訪問的父類的print_f方法")
a.prient_f()
運行結果如下:

在子類中重寫方法
簡單改一下上面的代碼,如下:
class People(object):
def __init__(self, name, age):
self.name = name
self.age = age
def print_f(self):
print("i am {0},i am {1} years old!!".format(self.name, self.age))
class Student(People):
def print_f(self): #重寫print_f方法
print("我是print_f方法,我已經在子類中被重寫!")
a = Student("zhangsan", 12)
a.print_f()
這時,運行結果就變成了這樣

方法的重寫,簡單的說就是在子類中命名一個與父類完全相同的方法。
類的私有屬性
現在我們知道,聲明一個實例后,這個實例就可以訪問類中的屬性,當我們想要一個屬性只在類的內部被使用而不能讓類外部的實例訪問是,這是可以定義私有變量。
只需要在變量名前加兩個下划線就行了(__),看下面的代碼:
class worker(object): #創建類
name = "wangwu" #公開變量 __age = 12 #私有變量 a = worker() #聲明實例 print(a.name) #訪問共有變量 print(a.__age) #訪問私有變量,會報錯

可以看到,當我們嘗試訪問私有變量時,會出現錯誤,
對於私有變量,我們可以在類型定義一個方法對它進行返回,當我們想要訪問這個屬性時,可以通過這個方法。如下。
class worker(object):
name = "wangwu"
__age = 12
def get__age(self):
return self.__age
a = worker()
print(a.name)
print(a.get__age())
把變量放在方法中的好處是,可以對變量的值進行檢查,判斷是否符合規則
