python的魔法函數(shù)

_init_()

所有類的超類object,有一個默認(rèn)包含pass的init()實(shí)現(xiàn),這個函數(shù)會在對象初始化的時候調(diào)用,我們可以選擇實(shí)現(xiàn),也可以選擇不實(shí)現(xiàn),一般建議是實(shí)現(xiàn)的,不實(shí)現(xiàn)對象屬性就不會被初始化,雖然我們?nèi)匀豢梢詫ζ溥M(jìn)行賦值,但是它已經(jīng)成了隱式的了,編程時顯示遠(yuǎn)比隱式的更好。

class Employee:
   '所有員工的基類'
   empCount = 0
 
   def __init__(self, name, salary):
      self.name = name
      self.salary = salary
      Employee.empCount += 1
   
   def displayCount(self):
     print "Total Employee %d" % Employee.empCount
 
   def displayEmployee(self):
      print "Name : ", self.name,  ", Salary: ", self.salary

_str_()

class cat:
...     def __init__(self,age,sex):
...             self.age = age
...             self.sex = sex
...     def __str__(self):
...             return "年齡是:%s , 性別是:%d" % (self.age, self.sex)
x = cat(34,'human')
print(x)
年齡是:34 , 性別是:human

總結(jié)幾點(diǎn):
1、在Python匯總方法名如果是xxx()格式的,就代表著這個方法名具有特殊的功能,也稱為“魔法”方法;
2、當(dāng)使用“print()”方法的時候,一旦定義了str(self)方法,那么就會讓該類實(shí)例對象被print調(diào)用時返回類的特定信息,即return方法后的語句。

_call_()

將實(shí)例變成函數(shù)可調(diào)用的對象。

class Person(object):
    def __init__(self, name, gender):
      self.name = name
      self.gender = gender

    def __call__(self, friend):
      print 'My name is %s...' % self.name
      print 'My friend is %s...' % friend
>>> p = Person('Bob', 'male')
>>> p('Tim')
  My name is Bob...
  My friend is Tim...

python name == ‘main’詳細(xì)解釋

一.語義解釋

1.__name__

name 是python的內(nèi)置屬性,是系統(tǒng)全局變量!每一個py文件都有一個屬于自己的name
如果py文件作為模塊被導(dǎo)入(import),那么name就是該py文件的文件名(也稱 模塊名);
如果py文件直接運(yùn)行時(Ctrl+Shift+F10),那么name默認(rèn)等于字符串”main”;
舉個簡單的例子:假如你名字是張三,在朋友眼中,你是張三(__name__ == '張三');在你自己眼中,你是你自己(__name__ == '__main__')

就是有這種操作

2.”__main__”

“_ main _” 實(shí)際上就是一個字符串,用來鑒別程序入口,沒有太多花里胡哨的東西.

3.name == “main

當(dāng).py文件被直接運(yùn)行時, if name == “main” 之下的代碼塊將被運(yùn)行,該語句就相當(dāng)與python的main主函數(shù)入口,示例代碼如下:
a.新建一個 my_name.py 文件,作為模塊文件:

# 定義一個函數(shù)并打印 __name__
def prit_name():
    print("my_name.py __name__:", __name__)
 
if __name__ == "__main__":
    prit_name()

b.新建一個 python_main.py 文件,作為啟動文件 (Ctrl+Shift+F10):

# 導(dǎo)入 my_name 模塊
import my_name
 
# 定義一個函數(shù)并打印 __name__
def prit_name():
    my_name.prit_name()
    print("python_main.py __name__:", __name__)
 
if __name__ == "__main__":
    prit_name()

輸出結(jié)果:

my_name.py __name__: my_name
python_main.py __name__: __main__

由此可見,作為啟動文件 python_main.py ,該文件的內(nèi)置屬性 name 等于 “main”,而my_name.py 作為導(dǎo)入模塊,該模塊的 name 等于文件名(也稱模塊名字),所以my_name.py 中的 表達(dá)式 if name == “main” 并不成立!

當(dāng)直接將my_name.py作為啟動文件時,輸出:

my_name.py __name__: __main__

如果py文件作為模塊被導(dǎo)入(import),那么name就是該py文件的文件名(也稱 模塊名);
如果py文件直接運(yùn)行時,那么name默認(rèn)等于字符串”main”;

廢話多

二.作用

1.name == “main” 作為啟動py文件的main函數(shù)入口
2.一個項(xiàng)目中必然會包含多個模塊文件,每個模塊文件在自己寫完代碼之后會做一些簡單的測試用于檢測bug 或者 對自己的函數(shù)調(diào)用寫一個簡單的示例,而恰到好處的是:name == “main” 既不會影響你的測試代碼,也不會影響別人調(diào)用你的接口函數(shù)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容