python 中的 main() 只是一个函数名。常见的成语
if __name__ == '__main__':
#do something
是找出此文件中的代码作为程序运行而不是作为模块导入的快捷方式。
因为 python 旨在实现无类型,所以社区非常重视约定和最佳实践。这不能提供与编译器相同级别的可预测性,但它有助于避免混乱。可读性是 Python 的核心价值,像这样的习语提供了有价值的结构。
Python 不像其他语言那样支持函数重载。在强类型语言中,您可能会编写具有相同名称但输入参数不同的同一函数的多个版本:
void DoSomething (int a) {};
void DoSomething (float f) {};
void DoSomething (string s){};
在 python 中没有等效的成语。在大多数情况下,它是不需要的:对于数字运算,您并不真正关心传入的数字是浮点数、整数还是其他数字——只要它们支持正确的运算符即可。这就是“鸭子打字”的蟒蛇咒语的用武之地 - 如果它像鸭子一样走路并且像鸭子一样嘎嘎叫,那么它就是一只鸭子。因此,python 函数惯用地在传入参数上查找函数或运算符,而不是检查它们的类型。
至于实例与静态方法:在 python 中,每个实例方法都隐式地将拥有的实例作为函数的第一个参数:
class Test(object):
def __init__(self, arg):
self.variable = arg
def example(self):
print self.variable
fred = Test(999) # note: no 'self' passed here
fred.example()
>>> 999
joe = Test(-1)
joe.example()
>>> -1
类方法获取类类型,而不是实例,作为隐式的第一个参数。类方法可以看到类级别的变量,这些变量是在类范围内而不是在实例范围内定义的——但它们对特定实例一无所知。
class TestCls (Test)
CLASS_VARIABLE = "hello"
# other behavior inherited from Test
@classmethod
def class_example(cls):
print cls.CLASS_VARIABLE
barney = TestCls(123)
barney.example()
>>> 123
barney.class_example() # again, no explicit class passed in
>>> 'hello'
静态方法根本没有隐式参数:
class TestStatic (TestCls):
CLASS_VARIABLE = 'goodbye'
# inherited stuff again
@staticmethod
def static_test():
print "behold, I have no implicit argument"
静态和类方法也不需要调用实例:
wilma = TestStatic(123)
wilma.static_test() # you can call from an instance
>>> behold, I have no implicit argument
# or not:
TestStatic.static_test()
>>> behold, I have no implicit argument
TestStatic.class_example()
>>> goodbye # the method is inherited, but the class variable come from this class