引言
有時候看到群里一些人問一些基礎的知識,雖然很基礎,網上隨便一查即可知道,但是往往很多人就是連這些基礎的知識都很模糊,甚至不清楚,這里再來復習一下python中類的一個知識點(僅此)。
類的定義
用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例。
舉個生活栗子,一個公司可以看作一個類,公司下的部門,可以方法,公司有很多不同級別的領導,可以看作是屬性,部門可以有很多,領導可以是BOSS,也可以是小部門的領導。所以一個類下面可以有多個方法和多個屬性,屬性可以只屬於某個方法,也可以是全局的。
類的創建
python3創建類的方式有兩種,一種帶括號,一種不帶括號。
class Test: def __init__(self,x): self.x = x def outprint(self): return self.x class Test2: def __init__(self,x): self.x = x def outprint(self): return self.x class Test3(object): def __init__(self,x): self.x = x def outprint(self): return self.x a = Test b = Test2 c = Test3 print(a) print(b) print(c) print(a(1)) print(b(1)) print(c(1))
運行結果:
<class '__main__.Test'> <class '__main__.Test2'> <class '__main__.Test3'> <__main__.Test object at 0x000001A6A7E88668> <__main__.Test2 object at 0x000001A6A7E88668> <__main__.Test3 object at 0x000001A6A7E88668>
結論:由此可見,python3創建類的時候,可以不帶括號,也可以帶,也可以顯示繼承object,如果帶個()空括號,其實也是隱士的繼承了object。這三種方式是相等的。
賦值
上面已經講了類的創建,在講類的實例化之前,先說一下賦值。
Python 中的變量不需要聲明。每個變量在使用前都必須賦值,變量賦值以后該變量才會被創建。在 Python 中,變量就是變量,它沒有類型,我們所說的"類型"是變量所指的內存中對象的類型。
等號(=)用來給變量賦值。
等號(=)運算符左邊是一個變量名,等號(=)運算符右邊是存儲在變量中的值。例如:
a = None print(id(a)) print(id(None)) print(a == None)
運行結果:
1625859280 1625859280 True
結論:可以看出,a賦值了None后,a 與None指向同一個內存地址,並且值也相等,所以a == None 是True。
我之前講過,python對象三個基本要素:id,value,type。id是對象的唯一標識,value對象的值,type標識對象的類型。所有變量即對象。
上面a is None的話,就是通過id來判斷,如果是a == None的話,就是通過value來判斷。
類的實例化
上面賦值我們用的是“等號”,是針對變量的。其實在講類的創建,也用了“=”號來賦值。
什么是實例化? “類提供默認行為,是實例的工廠”,打個比方,車是類,別克凱越是類的實例。
類的實例化只有一種方式,就是實例化的時候,需要帶括號,這個括號根據實際情況可以為空,也可以傳參。看例子:
class Test: def __init__(self,x): self.x = x def outprint(self): return self.x class Test_1(object): def __init__(self,x): self.x = x def outprint(self): return self.x # 給類起一個別名 a = Test # 實例化類 b = Test(1) # 實例化類 c = Test_1 print(a) print(a == Test) print(b) print(Test(1)) print(id(b)) print(id(Test(1))) print(b == Test(1)) print(c) # 賦值 d = a print(id(Test)) print(id(a)) print(id(d)) print(a == d) # 獲取當前類的屬性列表 print(dir(a)) print(dir(c))
運行結果:
<class '__main__.Test'> True <__main__.Test object at 0x00000168B1458630> <__main__.Test object at 0x00000168B1458668> 1549162350128 1549162350576 False <class '__main__.Test_1'> 1549339665432 1549339665432 1549339665432 True ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'outprint'] ['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'outprint'] Process finished with exit code 0
結論:我把前面的例子也寫進來了,就是方便理解,有點多,但要耐心點看。
上面的結果告訴我們:python的類,帶括號是實例化,不帶括號是賦值。(記住這個)
總結
以上內容是一個簡單的知識點,小知識點容易被忽略,不清楚的可以再復習一次。
另外,對測試開發,自動化測試技術與思想感興趣的朋友,可以加入QQ測開交流群:696400122進行交流,互相學習與進步。不積跬步無以至千里!