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