python的魔法函数

2020-10-09  本文已影响0人  单细胞空间交响乐

_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” 既不会影响你的测试代码,也不会影响别人调用你的接口函数。

上一篇下一篇

猜你喜欢

热点阅读