python中main,self,cls理解

参考: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.
 

 

 

你可能感兴趣的:(Python)