1、名詞解釋
類:類代表了具有相同特征的一類事物(人)
對象、實例:具體的某一個事物或者是人
實例化:將類變成對象的這么一個過程,即新建一個對象的過程,就是對類的一個實例化過程。
2、格式
函數定義:
def func1(): #這樣定義的叫做函數,它是在模塊中定義的。
pass
類定義:
class Person():
def func1(self): 在類里定義的函數,叫做方法,而不叫函數,請注意區別。
pass
#類變量,也叫屬性定義
name = "張三"
age = 30
#類私有變量定義,前面用雙下划線_定義的變量就是私有變量
__private_args = "class private"
#構造函數, 構造函數是在實例化的時候被自動運行的
def __init__(self, name, age):
print("構造函數運行")
p = person() #這里就是實例化一個對象,這一過程中,構造函數被執行
print(p.name)
print(p.age)
print(p.__private_args) #這里會報錯,因為__private_args是類的私有變量,對象不可訪問
3、構造函數
修改上面的類中構造函數如下:
def __init__(self, name, age, sex):
self.sex = sex
print(self.name)
print(self.age)
print(self.sex)
上面的self.name, self.age, self.sex叫實例變量,如果在構造函數里沒有對實例變量定義並賦值,將在類里找對應的同名類變量來作為。所以如果按照上面的構造函數。
在實例化時,p = Person("小紅“,“33”,“女”)
執行結果將打印
張三
33
女
因為上面的self.name, self.age沒有再構造函數里定義,則使用了同名類變量的默認值。
如果構造函數改成
def __init__(self, name, age, sex):
self.name = name
self.age = age
self.sex = sex
print(self.name)
print(self.age)
print(self.sex)
實例化p = Person("小紅“,“33”,“女”)將打印
小紅
33
女
上面的構造函數中,你可以理解成對類變量的重新復制,但更應該理解成重新定義的實例化變量。
4、私有方法定義
def __my_private_func(self): #雙下划線開頭
print("私有方法")
5、保護方法定義
def _my_protect_function(self): #一個下划線開頭
print("保護方法")
6、類方法定義
@classmethod
def my_calss_method(cls): #這里在方法上面要放一個裝飾器,方法的參數里寫cls,而不是self.
print("類方法")
7、靜態方法定義
@staticmethod
def my_static_method():
print("靜態方法")
8、公共方法定義,也叫普通方法
def get_private_args(self): #公共方法是類最常見的方法
return self.__private_args
9、關於self的思考與分析
a、上面的方法中,沒有self參數,行不行?
self代表的是一個實例,代表的是每一個類實例化的一個對象,名字可以隨便改,但是必須放在第一個位置。比如
def get_private_args(a): #沒有用self,而是寫了a
return a.__private_args
實例化驗證下:
p = Person("大山",40,"男")
print(p.get_private_args())
上面也能得知正確的結果
10、 靜態方法調用
Person.my_static_method()
也可以通過實例化后的對象調用
p.my_static_method()
靜態方法的低啊用,類不用實例化就可以調用,靜態方法一般是這個方法和這個類太大的直接性關系時用到。一般在寫工具類的時候可能會用到這種方法。
11、類方法的調用
Person.my_class_method()
也可以通過實例化后的對象調用
p.my_class_method()
12、python中,私有方法在外面能訪問嗎?
print(Person.__dict__)
能夠看到這個類里面包含所有的變量和方法名
print(p._Person__private_args)
p._Person__my_private_method()
答案是:可以訪問,只要在私有變量和私有方法前加上_Person(單下划線和類名)