class A(): #定义一个名称为A的类,必须要有括号和:,语法规定
def __init__(self, python): #构造方法,也是python的一个魔法方法,其实也就是一个初始化方法,
在类被创建的时候会自动调用这个方法,这个以双下划线开头的
__init__()方法可以说是python的一个内置api,每次创建类就会被调
用,如果不写这个方法也会被调用,只不过该方法为空,不执行任何操作
self.hh = python #创建一个全局变量,这个全局变量是相对与类而言,在整个A类里,所有的类方法
都能通过self.hh来获取到python这个变量,例如fun1中的print(self.hh)就
会打印python这个变量而不是打印fun1里的hh变量,此时self.hh指的是类里的全
局变量而不是函数的局部变量
def fun1(self): #类方法fun1
hh = 'linux' #方法中的局部变量,在fun1中print(hh)会打印linux,而不是打印python变量
self.param = 'test' #在类方法里定义一个类全局变量,类和类方法可以任意访问这个变量,fun2中
打印self.param是合法的。
print(self.hh) #打印类全局变量self.hh
print(hh)#打印类方法fun1中的hh变量
def fun2(self): #类方法fun2
print(self.param) #打印fun1中定义的类全局变量
a = A('I am python') #创建一个A类的实例a,并传入参数‘I am python’,这个参数将会传递给
__init__(self,python)构造方法的变量python,接着这个python的参数又传给了
self.hh,最终self.hh变量的值为I am python
a.fun1() #调用fun1
a.fun2() #调用fun2
python里的self参数代表自身的意思,它指向类本身,当类没有被创建也就是没有被实例化的时候(创建类也叫实例化对象),即当a没有被创建(实例化)的时候,这个类是没有被分配内存的,一旦创建(实例化)self就指向类本身,类似于java中的this,只要加了self.的变量都会被视为类的全局变量,类本身和类方法可以调用它,不加self.的话就是局部变量,方法中不能调用
以上代码的大概流程是,创建一个类A,同时在构造方法(魔法方法)中初始化类,由于每次创建类的时候都会先自动执行__init__()这个方法,所以一般将要初始化的代码放在__init__()方法里,例如初始化一个变量self.hh,当a=A()这行代码执行的时候就会调用__init__(self,python)这个函数,python的变量就会传递给self.hh,为了更好的演示在__init__(self,python)这个方法做了什么,我们可以这样做
class A():
def __init__(self, python):
self.hh = python
self.fun1()
self.fun2()
def fun1(self):
hh = 'linux'
self.param = 'test'
print(self.hh)
print(hh)
def fun2(self):
print(self.param)
a = A('I am python')
将fun1和fun2的调用放到__init__(self,python)这个方法里面去,结果打印的结果和上一段代码一致,虽然我们在实例化a之后没有用a.fun1,a.fun2去调用fun1和fun2这两个方法,但是在构造方法中调用了这两个方法,导致a被创建(实例化)的时候就执行了里面的打印函数