总目录:https://blog.csdn.net/qq_41106844/article/details/105553392
Python - 子目录:https://blog.csdn.net/qq_41106844/article/details/105553333
在类基础中简单说过self的用法和含义。这里我们细说一下。
首先定义一个类
class Dog(object):
pass
Dog = Dog()
因为类有模板的作用,因此,可以在创建实例的时候,把我们认为必须绑定的属性强制填写进去。这里就用到Python当中的一个内置方法__init__方法,例如在Dog类时,把name、age等属性绑上去:
class Dog(object):
def __init__(self, name, age):
self.name = name
self.age = age
这里注意:
1、__init__方法的第一参数永远是self,表示创建的类实例本身,因此,在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身
2、有了__init__方法,在创建实例的时候,就不能传入空的参数了,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器会自己把实例变量传进去
class Dog(object):
def __init__(self, name, age):
self.name = name
self.age = age
dog =Dog('哈士奇',2)
print(dog.name)
print(dog.age)
哈士奇
2
这里self就是指类实例本身,self.name就是Dog实例对象,是该Dog实例对象独有的。而name是外部传来的参数,不是Dog类所自带的。故,self.name = name的意思就是把外部传来的参数name的值赋值给Dog实例对象自己的属性变量self.name。
例2:
class Dog:
def __init__(self,name,type = None,call = '汪'):
self.name = name
self.type = type
self.call = call
def calls(self,second):
self.call = self.pay*second
return self.call
p = Dog("旺财","中华田园犬")
print(p.calls(3))
汪汪汪
self是指当前被调用的对象,对的,就是上边刚被你实例化的对象p。当你需要调用当前对象(实例对象)的方法或者属性时,要用self. 来进行调用。
例3:
class Dog:
def setdog(self,x,y):
self.x = x
self.y = y
def printdog(self):
print("我喜欢什么狗:"+self.x +"和"+self.y)
dd = Dog()
dd.setXY("哈士奇","中华田园犬")
self参数:当实例对象dd去调用setdog方法的时候,它传入的第一个参数就是dd,那么self.x = "哈士奇",self.y = "中华田园犬"也就相当于dd.x = "哈士奇",dd.y = "中华田园犬",所以你在实例对象,甚至类对象中都看不到x和y,因为这两个属性是只属于实例对象dd的。
例4:
class TestClass(object):
val1 = 100
def __init__(self):
self.val2 = 200
def fcn(self, val=400):
val3 = 300
self.val4 = val
self.val5 = 500
if __name__ == '__main__':
inst = TestClass()
print(TestClass.val1)
print(inst.val1)
print(inst.val2)
#print(inst.val3)
#val3为局部变量,无法在函数为调用'TestClass' object has no attribute 'val3'
#print(inst.val4)
#print(inst.val5)
这里
val1是类变量,可以由类名直接调用,也可以有对象来调用;
val2是成员变量,可以由类的对象来调用,这里可以看出成员变量一定是以self.的形式给出的,因为self的含义就是代表实例对象;
val3不是成员变量,它只是函数fcn内部的局部变量;
val4和val5也都不是成员变量,虽是以self.给出,但并没有在构造函数中初始化。
注:
在类方法中也可以调用其他方法
class Dog():
def __init__(self,name,age):
self.name = name
self.age = age
def get_dog_information(self):
dog_information = "name is {0},age is {1}".format(self.name,self.age)
return dog_information
def get_dog_speak(self,love):
dog_speak = self.get_dog_information() + love
return dog_speak
dog = Dog("jake",13)
print(dog.get_dog_speak("swimming"))
name is jake,age is 13swimming
在上面例子中:在get_dog_information()方法中调用了get_dog_information(),且get_dog_information()方法前加了self参数,该参数的意义与其他self的意思一样,都是代表实际本身