参考:https://blog.csdn.net/anshuai_aw1/article/details/82344884
一 .if __name__ == "__main__":
if __name__ == '__main__'
的意思是:当.py文件被直接运行时,if __name__ == '__main__'
之下的代码块将被运行;当.py文件以模块形式被导入时,if __name__ == '__main__'
之下的代码块不被运行
例子:
+++ const.py ++++
PI = 3.14
def main():
print("PI:", PI)
if __name__ == "__main__":
main()
+++ area.py +++
from const import PI
def calc_round_area(radius):
return PI * (radius ** 2)
def main():
print("round area: ", calc_round_area(2))
main()
运行 area.py
-----------------------------------
运行结果:
round area: 12.56
-------------------------------------
当注释掉if __name__ == "__main__":后,运行结果为:
---------------------------------
运行结果:
PI: 3.14
round area: 12.56
------------------------------------
二. self
2.1 self的含义
python的self,是个对象(Object),是当前类的实例。
2.2 Python中为何要有self
那就是:
在类的代码(函数)中,需要访问当前的实例中的变量和函数的,即,访问Instance中的:
对应的变量(属性,property):Instance.ProperyNam,去读取之前的值和写入新的值
调用对应函数(function):Instance.function(),即执行对应的动作
-> 而需要访问实例的变量和调用实例的函数,当然需要对应的实例Instance对象本身
-> 而Python中就规定好了,函数的第一个参数,就必须是实例对象本身,并且建议,约定俗成,把其名字写为self
-> 所以,我们需要self
而如果没有用到self,即代码中,去掉self后,那种写法所使用到的变量,实际上不是你所希望的,不是真正的实例中的变量和函数,而是的访问到了其他部分的变量和函数了。甚至会由于没有合适的初始化实例变量,而导致后续无法访问的错误。
例子:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
name = 'whole global name'
'''
注:此处全局的变量名,写成name,只是为了演示而用
实际上,好的编程风格,应该写成gName之类的名字,
以表示该变量是Global的变量
'''
class Person(object) :
def __init__(self, newPersonName) :
self.name = newPersonName
'''
此处正确的,通过访问self.name的形式,实现了:
1.给实例中,增加了name变量
2.并且给name赋了初值,为newPersionName
'''
def sayYourName(self) :
'''
此处由于开始正确的初始化了self对象,使得其中有了name变量,
所以此处可以正确访问了name值了
'''
print('My name is %s' % self.name)
def selfAndInitDemo() :
personInstance = Person('Tim')
personInstance.sayYourName()
if __name__ == '__main__' :
selfAndInitDemo()
'''My name is Tim'''
如果注释掉:“self.”,即变为:name = newPersonName
报错为:AttributeError: 'Person' object has no attribute 'name'
例子2
全局变量和局部变量
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: antcolonies
name = 'whole global name'
'''
注:此处全局的变量名,写成name,只是为了演示而用
实际上,好的编程风格,应该写成gName之类的名字,
以表示该变量是Global的变量
'''
class Person(object):
name = 'class global name'
def __init__(self, newPersonName):
# self.name = newPersonName
'''
此处,没有使用self.name
而使得此处的name,实际上仍是局部变量name
虽然此处赋值了,但是后面没有被利用到,属于被浪费了的局部变量name
'''
name = newPersonName
def sayYourName(self):
'''
此处,之所以没有像之前一样出现:
AttributeError: Person instance has no attribute 'name'
那是因为,虽然当前的实例self中,没有在__init__中初始化对应的name变量,实例self中没有对应的name变量
但是由于实例所对应的类Person,有对应的name变量,所以也是可以正常执行代码的
对应的,此处的self.name,实际上是Person.name
'''
print('My name is %s' %self.name)
print('Name within class Person is actually the global name: %s' %name)
print("Only access Person's name via Person.name = %s" %(Person.name))
def selfAndInitDemo():
personInstance = Person('Tim')
personInstance.sayYourName()
print('whole global name is %s' %name)
if __name__ == '__main__':
selfAndInitDemo()
运行结果
'''
My name is class global name
Name within class Person is actually the global name: whole global name
Only access Person's name via Person.name = class global name
whole global name is whole global name
'''
3.