python的魔法函数
_init_()
所有类的超类object,有一个默认包含pass的init()实现,这个函数会在对象初始化的时候调用,我们可以选择实现,也可以选择不实现,一般建议是实现的,不实现对象属性就不会被初始化,虽然我们仍然可以对其进行赋值,但是它已经成了隐式的了,编程时显示远比隐式的更好。
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
总结几点:
1、在Python汇总方法名如果是xxx()格式的,就代表着这个方法名具有特殊的功能,也称为“魔法”方法;
2、当使用“print()”方法的时候,一旦定义了str(self)方法,那么就会让该类实例对象被print调用时返回类的特定信息,即return方法后的语句。
_call_()
将实例变成函数可调用的对象。
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’详细解释
一.语义解释
1.__name__
name 是python的内置属性,是系统全局变量!每一个py文件都有一个属于自己的name:
如果py文件作为模块被导入(import),那么name就是该py文件的文件名(也称 模块名);
如果py文件直接运行时(Ctrl+Shift+F10),那么name默认等于字符串”main”;
举个简单的例子:假如你名字是张三,在朋友眼中,你是张三(__name__ == '张三')
;在你自己眼中,你是你自己(__name__ == '__main__')
2.”__main__”
“_ main _” 实际上就是一个字符串,用来鉴别程序入口,没有太多花里胡哨的东西.
3.name == “main”
当.py文件被直接运行时, if name == “main” 之下的代码块将被运行,该语句就相当与python的main主函数入口,示例代码如下:
a.新建一个 my_name.py 文件,作为模块文件:
# 定义一个函数并打印 __name__
def prit_name():
print("my_name.py __name__:", __name__)
if __name__ == "__main__":
prit_name()
b.新建一个 python_main.py 文件,作为启动文件 (Ctrl+Shift+F10):
# 导入 my_name 模块
import my_name
# 定义一个函数并打印 __name__
def prit_name():
my_name.prit_name()
print("python_main.py __name__:", __name__)
if __name__ == "__main__":
prit_name()
输出结果:
my_name.py __name__: my_name
python_main.py __name__: __main__
由此可见,作为启动文件 python_main.py ,该文件的内置属性 name 等于 “main”,而my_name.py 作为导入模块,该模块的 name 等于文件名(也称模块名字),所以my_name.py 中的 表达式 if name == “main” 并不成立!
当直接将my_name.py作为启动文件时,输出:
my_name.py __name__: __main__
如果py文件作为模块被导入(import),那么name就是该py文件的文件名(也称 模块名);
如果py文件直接运行时,那么name默认等于字符串”main”;
废话多
二.作用
1.name == “main” 作为启动py文件的main函数入口
2.一个项目中必然会包含多个模块文件,每个模块文件在自己写完代码之后会做一些简单的测试用于检测bug 或者 对自己的函数调用写一个简单的示例,而恰到好处的是:name == “main” 既不会影响你的测试代码,也不会影响别人调用你的接口函数。