python创建一个类初始化两个变量name、age_Python小白入门:第八讲||类
Python 是一種面向對象的編程語言。在面向對象編程中,你編寫表示現實世界中的事務和情景的類,并基于這些類來創建對象。
編寫類時,你定義的一大類對象都有的通用行為。基于類創建對象時,每個對象都自動具備這種通用行為,然后可根據需要賦予每個對象獨特的個性。
根據類來創建對象被稱為實例化,這讓你能夠使用類的實例。
在這一講中,你將學習:如何編寫類;
如何使用屬性在類中存儲信息,以及如何編寫方法,以讓類具備所需的行為;
如何編寫方法__init__() ,以便根據類創建包含所需屬性的 實例。
如何修改實例的屬性——包括直接修改以及通過方法進行修改。
使用繼承可簡化相關類的創建工作;將一個類的實例用作另一個類的屬性可讓類更簡潔。
通過將類存儲在模塊中,并在需要使用這些類的文件中導入它們,可讓項目組織有序。
Python標準庫,并見識了一個使用模塊collections 中 的OrderedDict 類的示例。
編寫類時應遵循的Python約定。
8.1創建和使用類
使用類可以模擬任何東西。
下面我們根據一個例子來更好的理解類:摘自《Python編程:從入門到實踐》
8.1.2 創建Dog類
對于大多數狗,他們都有名字和年齡,它們還會蹲下和打滾。我們來創建一個Dog類包含他們。這個類讓Python創建表示小狗的對象(實例)。
蹲下(sit())打滾(roll_over())
class Dog():
"""一次模擬小狗的簡單嘗試"""
def _init_(self, name, age):
"""初始化屬性name和age"""
self.name = name
self.age = age
def sit(self):
"""模擬小狗被命令時蹲下"""
print(self.name.title() + " is now sitting.")
def roll_over(self):
"""模擬小狗被命令時打滾"""
print(self.name.title() + " rolled over")
第一行代碼,定義了一個名為Dog的類。
記住在Python中,首字母大寫的名稱指的是類。
類中的函數稱為方法,方法__init__()是一個特殊的方法,每當你根據Dog類來創建實例時,會自動運行它。
在這個方法名稱中,開頭和末尾各有兩個下劃線,這是為了避免Python默認方法與普通方法發生沖突。
方法__init__()包含三個形參:self, name,age。其中self必不可少,還必須位于其他形參前面。
為什么必須包含形參self呢?
因為Python調用方法__init__()來創建實例時,將自動傳入實參self。
每個與類相關聯的方法調用都自動傳遞實參self,它是一個指向實例本身的引用,讓實例能夠訪問類中屬性和方法。
每次我們根據Dog類創建實例時,都只需給后面兩個形參提供值,self會自動傳遞。
self.name = name和self.age = age都有前綴self。以self為前綴的變量都可供類中的所有方法使用,我們還可以通過類的任何實例來訪問這些變量。
self.name = name獲取存儲在形參name中的值,并將其存儲在變量name中,然后該變量被關聯到當前創建的實例。self.age = age 與此類似。向這樣可通過實例訪問的變量稱為屬性。
方法sit()和roll_over()不需要額外的信息,因此只有一個形參self。當前這兩個方法都只是簡單的打印一條消息。
注意:在Python2.7中創建類時,在括號類包含單詞object
class Dog(object):
8.1.2根據類創建實例
接下來我們創建一個表示小狗的實例
class Dog():
"""一次模擬小狗的簡單嘗試"""
def _init_(self, name, age):
"""初始化屬性name和age"""
self.name = name
self.age = age
def sit(self):
"""模擬小狗被命令時蹲下"""
print(self.name.title() + " is now sitting.")
def roll_over(self):
"""模擬小狗被命令時打滾"""
print(self.name.title() + " rolled over")
my_dog = Dog('whilie', 6)
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")
我們根據類創建了一個名為whillie 年齡位6的小狗實例。Python調用方法__init__(),并接受我們傳遞的實參,返回一個表示小狗的實例,并將其存儲在變量my_dog中。
其中代碼:my_dog.name 是句點表示法,以此來訪問屬性。
輸出
My dog's name is Willie.
My dog is 6 years old.
如何訪問類中的其他方法呢 ?
和訪問屬性的方法類似——句點表示法
my_dog.sit()
my_dog.roll_over()
輸出
Willie is now sitting.
Willie rolled over!
如果需要創建多個實例,多次調用類即可。
8.2 使用類和實例
類編寫好后,就要學習如何使用類了。其中很重要的一個任務是學習如何修改實例的屬性。
8.2.1 給屬性指定默認值
類中的每個屬性都必須有初始值,哪怕這個值是0或空字符串。如果你給屬性指定了默認值,定義類是就無需包含為他提供初值的形參。
class Dog():
"""一次模擬小狗的簡單嘗試"""
def _init_(self, name):
"""初始化屬性name和age"""
self.name = name
self.age = 6
def sit(self):
"""模擬小狗被命令時蹲下"""
print(self.name.title() + " is now sitting.")
def roll_over(self):
"""模擬小狗被命令時打滾"""
print(self.name.title() + " rolled over")
8.2.2 修改屬性的值
直接修改——通過實例訪問它,然后修改
my_dog.age = 10
通過方法修改——編寫一個方法來修改屬性
class Dog():
"""一次模擬小狗的簡單嘗試"""
def _init_(self, name):
"""初始化屬性name和age"""
self.name = name
self.age = 6
def sit(self):
"""模擬小狗被命令時蹲下"""
print(self.name.title() + " is now sitting.")
def roll_over(self):
"""模擬小狗被命令時打滾"""
print(self.name.title() + " rolled over")
def update_age(self, num)
self.age = num
my_dog.update_age(10)
my_dog.update_age(10) 這里調用方法,并傳遞給形參num一個值,將num的值賦給屬性age。
8.3 繼承
編寫類時,并非要從空白開始。
當你編寫的類是另一個現成類的特殊版本,可使用繼承
一個類繼承另一個類時,他將自動獲得另一個類的所有屬性和方法;原有的類稱為父類,而新類稱為子類。子類繼承了父類的所有屬性和方法,同時還可以定義自己的屬性和方法。
8.3.1 子類的方法__init__
創建子類的實例時,需要先給其父類的所有屬性賦值。
class Dog():
"""一次模擬小狗的簡單嘗試"""
def _init_(self, name, age):
"""初始化屬性name和age"""
self.name = name
self.age = age
def sit(self):
"""模擬小狗被命令時蹲下"""
print(self.name.title() + " is now sitting.")
def roll_over(self):
"""模擬小狗被命令時打滾"""
print(self.name.title() + " rolled over")
class Dog_2(Dog):
"""另一個特殊的Dog類"""
def __init__(self, name, age)
"""初始化父類的屬性"""
super().__init__(name, age)
my_dog_2 = Dog_2('wodfg', 7)
my_dog_2.sit()
my_dog_2.roll_over()
定義子類時,必須在括號內指定父類的名稱。
方法super()是一個特殊函數,幫助Python將父類和子類關聯起來。這行代碼讓Python調用父類的方法__init__(),讓子類包含父類所有的屬性。父類也稱其為超類,名稱super由此而來。
在Python2.7中繼承語法稍有不同,函數super需要兩個形參:子類名和對象self
class Dog_2(Dog):
"""另一個特殊的Dog類"""
def __init__(self, name, age)
"""初始化父類的屬性"""
super(Dog_2, self).__init__(name, age)
我們創建好子類之后可以給子類定義屬性和方法。
如果父類中的某個方法并不符合你的預期,你可對其進行重寫:在子類中定義一個方法,方法名與父類的相同。這樣Python只會使用子類中的方法。
如果發現自己的類代碼太長,不便于閱讀,可以將一部分作為一個獨立的類提取出來。
8.4 導入類
當你不斷給類添加功能,代碼變長。為了讓代碼更簡潔,你可以將類存儲在模塊中,然后再主程序中導入所需的模塊。
我們將Dog類存儲在一個名為dog.py的模塊中
導入單個類
from dog import Dog
我們也可以在一個模塊中存儲多個類,需要哪個就導入哪個。
form dog import Dog, Dog_2
導入整個模塊
import dog
導入模塊中所有類
from module_name import *
不推薦使用這種導入方式,首先,這種方式沒有明確指出你使用了模塊中的那些類。
如果你不小心導入一個與程序文件中其他東西同名的類,將引發難以診斷的錯誤。
需要從一個模塊中導入很多類時,最好導入整個模塊,并使用module_name.calss_name語法來訪問類。
這樣做,雖然文件開頭并沒有列出用到的所有類,但你清楚的直到在程序的哪些地方使用了導入的模塊,還避免了導入模塊中的每個類可能引發的名稱沖突。
在一個模塊中導入另一個模塊
有時候需要將類分散到多個模塊中,以免模塊太大,或者在同一個模塊中存儲不相關的類。
將類存儲在不同模塊中時,你可能會發現一個模塊中的類依賴于另一個模塊中的類。
在這種情況下,可在前一個模塊中導入必要的類。
8.5 Python標準庫
Python標準庫是一組模塊,安裝的Python都包含它
可使用標準庫中任何函數和類,為此只需在程序開頭包含一條簡單的import語句。
下面來看模塊collections中的一個類——OrderedDict。
字典讓你能夠將信息關聯起來,但它們不記錄你添加鍵-值對的順序。
要創建字典并記錄其中的鍵值對添加順序,可使用模塊collections中的OrderedDict類。
OrderedDict實例的行為幾乎與字典相同,區別只在于記錄鍵值對的添加順序。
from collections import OrderedDict
favourite_languages = OrderedDict()
favourite_languages['jen'] = 'Python'
favourite_languages['sarah'] = 'c'
favourite_languages['edward'] = 'ruby'
favourite_languages['phil'] = 'pyython'
for name, language in favourite_languages.items():
print(name.title() + "'s favourite language is " + language.title() + ".")首先從模塊collections中導入了OrderedDict類。
然后創建了一個實例,并將其存儲到favourite_languages中。
這里并沒有使用花括號,而是調用OrderedDict()來創建一個空的有序字典,并將其存儲在favourite_languages中。
加下來我們以每次一對的方式添加(名字-語言)對。
8.6 類編碼風格
你必須熟悉有些與類相關的編碼風格問題,在你編寫的程序較復雜時尤其如此。類名應采用駝峰命名法,即將類名中的每個單詞的首字母都大寫,而不使用下劃線。
實例名和模塊名都采用小寫格式,并在單詞之間加上下劃線。
對于每個類,都應緊跟在類定義后面包含一個文檔字符串。
這種文檔字符串簡要地描述類的功能,并遵循編寫函數的文檔字符串時采用的格式約定。
每個模塊也都應包含一個文檔字符串,對其中的類可用于做什么進行描述。
可使用空行來組織代碼,但不要濫用。
在類中,可使用一個空行來分隔方法;而在模塊中,可使用兩個空行來分隔類。
需要同時導入標準庫中的模塊和你編寫的模塊時,先編寫導入標準庫模塊的import 語句,
再添加一個空行,然后編寫導入你自己編寫的模塊的import語句。
在包含多 條import 語句的程序中,這種做法讓人更容易明白程序使用的各個模塊都來自何方。
碼字不易 對你有幫助的話 關注一下專欄
喜歡+收藏+評論 謝謝大家 抱拳了
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的python创建一个类初始化两个变量name、age_Python小白入门:第八讲||类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql交互式创建表_用mysql语句
- 下一篇: python管道符_Python实现处理