網(wǎng)頁設(shè)計 效果圖亞馬遜seo推廣
一、? if __name__ == '__main__'
if __name__ == '__main__'的意思是:
當(dāng).py文件被直接運行時,if __name__ == '__main__'之下的代碼塊將被運行;
當(dāng).py文件以模塊形式被導(dǎo)入時,if __name__ == '__main__'之下的代碼塊不被運行。
1.1、一個? xxx.py 文件被其他 xxx.py 文件引用
創(chuàng)建一個const.py文件:
PI = 3.14def main():print("PI:", PI)
main()
# 運行結(jié)果:PI: 3.14
寫一個用于計算圓面積的area.py文件,area.py文件需要用到const.py文件中的PI變量。從const.py中,我們把PI變量導(dǎo)入area.py:
from const import PIdef calc_round_area(radius):return PI * (radius ** 2)def main():print("round area: ", calc_round_area(2))main()'''
運行結(jié)果:
PI: 3.14
round area: 12.56
'''
1.2 修改const.py,添加if __name__ == '__main__'
? ? ? 我們看到const.py中的main函數(shù)也被運行了,實際上我們不希望它被運行,因為const.py提供的main函數(shù)只是為了測試常量定義。這時if __name__ ==? '__main__'派上了用場,我們把const.py改一下,添加if __name__ == '__main__'
PI = 3.14def main():print("PI:", PI)if __name__ == "__main__":main()運行結(jié)果
PI: 3.14
導(dǎo)入const.py,運行area.py:
輸出結(jié)果:
round area: 12.56#不顯示:PI: 3.14
二、__init__與self
2.1?Python中self的含義
? ? ? self,英文單詞意思很明顯,表示自己,本身。python的self,是個對象(Object),是當(dāng)前類的實例
2.2 Python中為何要有self
? ? ?在定義一個類時,首先需要定義一個構(gòu)造函數(shù)。構(gòu)造函數(shù)是用來初始化對象的屬性的。在Python中,構(gòu)造函數(shù)的第一個參數(shù)通常是self。self代表當(dāng)前的對象實例,可以用來引用該對象的屬性和方法。
? ? ?在Python中,如果要使用一個對象的屬性或方法,首先需要實例化對象。實例化對象是指創(chuàng)建一個對象的實例,也就是根據(jù)類創(chuàng)建一個具體的對象。在實例化對象時,通常需要傳入一些參數(shù)來初始化對象的屬性。
Python中就規(guī)定好了,函數(shù)的第一個參數(shù),就必須是實例對象本身,并且建議,約定俗成,把其名字寫為self
2.3_init__方法的作用:
? ? ? __init__ 方法是 Python 中面向?qū)ο缶幊讨蓄惖奶厥夥椒?#xff0c;也稱為構(gòu)造方法,當(dāng)創(chuàng)建一個類的實例時,__init__ 方法會自動調(diào)用。
? ? ? ?它的主要作用是初始化實例的屬性,實例變量是對象的屬性,用于存儲數(shù)據(jù)。在實例被創(chuàng)建后,你可以通過這些屬性對實例進行操作。每個類可以定義多個不同的 __init__ 方法,但通常情況下,在類中只有一個,在這種情況下,在創(chuàng)建類的實例時,必須提供所需的參數(shù)。
def __init__(self, 參數(shù)1, 參數(shù)2, ...):初始化語句1初始化語句2...
實例:在類中使用 init 方法初始化類的屬性
class Dog:def __init__(self, breed, name, age):self.breed = breedself.name = nameself.age = agedog = Dog("Labrador", "Max", 3)print(dog.breed) # Output: Labrador
print(dog.name) # Output: Max
print(dog.age) # Output: 3
在這個例子中,我們創(chuàng)建了一個名為 Dog 的類,并且定義了 init 方法。 init 方法接收三個參數(shù):breed, name 和 age,并且通過 self. 前綴來設(shè)置類的屬性。最后,我們創(chuàng)建了一個名為 dog 的對象,并且初始化了它的 breed, name 和 age 屬性。
2.4__init__()和self對象
class Person(object):def __init__(self, name, lang, website):self.name = nameself.lang = langself.website = websiteprint('self: ', self)print('type of self: ', type(self))
'''
未實例化時,運行程序,構(gòu)造方法沒有運行
'''p = Person('Tim', 'English', 'www.universal.com') '''實例化后運行的結(jié)果
self: <__main__.Person object at 0x00000000021EAF98>
type of self: <class '__main__.Person'>
'''
可以看出self為實例變量p,是一個Person類型的對象
class Dog(object): def __init__(self,name,dog_type):self.name = nameself.type = dog_typedef sayhi(self):print("hello,I am a dog, my name is ",self.name)d = Dog('LiChuang',"京巴") # 實例化
d.sayhi()
以下是d = Dog('LiChuang',"京巴")實例化的示意圖:
?2.5 如果沒有在__init__中初始化對應(yīng)的實例變量的話,導(dǎo)致后續(xù)引用實例變量會出錯
? ? ? 如下代碼,完整的演示了,如果沒有在類Class的最初的__init__函數(shù)中,正確的初始化實例變量,則會導(dǎo)致后續(xù)沒有變量可用,因而出現(xiàn)AttributeError的錯誤:
name = 'whole global name'
'''
注:此處全局的變量名,寫成name,只是為了演示而用
實際上,好的編程風(fēng)格,應(yīng)該寫成gName之類的名字,
以表示該變量是Global的變量
'''class Person(object):def __init__(self, newPersonName):# self.name = newPersonName'''如果此處不寫成self.name那么此處的name,只是__init__函數(shù)中的局部臨時變量name而已和全局中的name,沒有半毛錢關(guān)系'''name = newPersonName'''此處只是為了代碼演示,而使用了局部變量name,不過需要注意的是,此處很明顯,由于接下來的代碼也沒有利用到此處的局部變量name則就導(dǎo)致了,此處的name變量,實際上被浪費了,根本沒有利用到'''def sayYourName(self):'''此處由于找不到實例中的name變量,所以會報錯:AttributeError: Person instance has no attribute 'name''''print('My name is %s' %self.name)def selfAndInitDemo():personInstance = Person('Tim')personInstance.sayYourName()if __name__ == '__main__':selfAndInitDemo()''' 未使用self.name時拋異常
Traceback (most recent call last):File "E:/python14_workspace/s14/day06/test_1.py", line 18, in <module>selfAndInitDemo()File "E:/python14_workspace/s14/day06/test_1.py", line 15, in selfAndInitDemopersonInstance.sayYourName()File "E:/python14_workspace/s14/day06/test_1.py", line 11, in sayYourNameprint('My name is %s' %self.name)
AttributeError: 'Person' object has no attribute 'name'
'''
從上述代碼可見,由于在類的初始化(實例化)的__init__函數(shù)中,沒有給self.name設(shè)置值,使得實例中,根本沒有name這個變量,導(dǎo)致后續(xù)再去訪問self.name,就會出現(xiàn)AttributeError的錯誤了。
對應(yīng)的,如果寫成self.name,則意思就正確了,就是初始化的時候,給實例中新增加,并且正常設(shè)置了正確的值newPersionName了,所以后續(xù)再去通過self.name,就可以訪問到,當(dāng)前實例中正確的變量name了。
相應(yīng)的正確寫法的代碼如下:
name = 'whole global name'
'''
注:此處全局的變量名,寫成name,只是為了演示而用
實際上,好的編程風(fēng)格,應(yīng)該寫成gName之類的名字,
以表示該變量是Global的變量
'''class Person(object):def __init__(self, newPersonName):self.name = newPersonName'''此處正確的,通過訪問self.name的形式,實現(xiàn)了:1.給實例中,增加了name變量2.并且給name賦了初值,為newPersionName'''def sayYourName(self):'''此處由于開始正確的初始化了self對象,使得其中有了name變量,所以此處可以正確訪問了name值了'''print('My name is %s' %self.name)def selfAndInitDemo():personInstance = Person('Tim')personInstance.sayYourName()if __name__ == '__main__':selfAndInitDemo()'''My name is Tim'''