定义类
定义一个类,格式如下:
class 类名:
方法列表
demo:定义一个Car类
In [1]: #定义一个Car类 In [2]: class Car(): ...: #方法 ...: def getCarInfo(self): ...: print('车轮的数量是:%d,颜色是:%s'%(self.wheelNum,self.color)) ...: def move(self): ...: print('车正在移动...')
说明:
1.定义类时有2种,新式类和经典类,上面的Car为经典类,如果Car(object)则为新式类;
2.类名的命名规则为“大驼峰”
创建对象
刚刚我们已经定义了一个Car类,就好比我们有了车子的图纸,那么接下来就需要交给生产工人们去创造了
在python中,可以根据已经定义的类去创建出一个一个的对象,创建对象的格式为:
对象名 = 类名()
创建对象demo:
In [1]: #定义一个Car类 In [2]: class Car(): ...: #方法 ...: def getCarInfo(self): ...: print('车轮的数量是:%d,颜色是:%s'%(self.wheelNum,self.color)) ...: def move(self): ...: print('车正在移动...') ...: In [3]: #创建一个对象,并用变量BMW来保存它的引用 In [4]: BMW = Car() In [5]: BMW.color = '黑色' In [6]: BMW.wheelNum = 4 In [7]: BMW.move() 车正在移动...
In [8]: print(BMW.color)
黑色
In [9]: print(BMW.wheelNum)
4
总结:
1)BMW = Car(),这样就产生了一个Car的实例对象,此时也可以通过实例对象BMW来访问属性或者方法
2)第一次使用BMW.color = '黑色'表示给BMW这个对象添加属性,如果后面再次出现BMW.color = xxx ,则代表对属性进行修改
3)BMW是一个对象,它拥有属性(数据)和方法(函数)
4)当创建一个对象时,就是用一个模子,来制造的一个实物
__init__方法
在上一节的demo中,我们已经给BMW这个对象添加2个属性,wheelNum和color,试想如果再创建一个对象的话,肯定也要对其添加属性,显然这样很费事,那么就需要有一个方法,在创建对象的时候,就顺便把这个对象的属性给设置了
__init__方法
<1>使用方法
Class 类名:
#初始化函数,用来完成一些默认的设定
def __init__(self):
pass
<2>__init__方法的调用
11 #定义汽车类 12 class Car(): 13 14 def __init__(self): 15 self.wheelNum = 4 16 self.color = '黑色' 17 def move(self): 18 print('车子在跑...') 19 20 #创建对象 21 BMW = Car() 22 print('车的颜色为:%s'%BMW.color) 23 print('车轮胎数为:%d'%BMW.wheelNum)
总结:
当创建完Car对象后,在没有调用__init__()方法的前提下,BMW就默认拥有了2个属性,原因是__init__()方法在被创建后,就立刻被默认调用了
想一想
既然在创建完对象后__init__()方法已经被默认执行了,那么有没有办法让对象在调用__init__()方法的时候传递一些参数呢?如果可以,是怎么样传递的呢?
11 #定义汽车类 12 class Car(): 13 14 def __init__(self,wheelNum,color): 15 self.wheelNum = wheelNum 16 self.color = color 17 def move(self): 18 print('车子在跑...') 19 20 #创建对象 21 BMW = Car(4,'白色') 22 print('车的颜色为:%s'%BMW.color) 23 print('车轮胎数为:%d'%BMW.wheelNum)
python3 test.py
车的颜色为:白色
车轮胎数为:4
总结:
1)__init__()方法,在创建一个对象的时候默认被调用,不需要手动调用
2)__init__(self)中, 默认有1个参数名字为slef,如果再创建对象时传递了2个实参,那么__init__(self)中除了self作为第一个形参外还需要2个形参,例如__init__(self,x,y)
3)__init__(self)中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递进去
魔法方法
首先看一下以下代码:
11 #定义汽车类 12 class Car(): 13 14 def __init__(self,wheelNum,color): 15 self.wheelNum = wheelNum 16 self.color = color 17 def move(self): 18 print('车子在跑...') 19 20 #创建对象 21 BMW = Car(4,'白色') 22 print(BMW) #这行代码即是将BMW使用print进行输出 23 print('车的颜色为:%s'%BMW.color) 24 print('车轮胎数为:%d'%BMW.wheelNum)
得到的结果:
python3 test.py <__main__.Car object at 0x7f2b87338940> #这里看到的是创建出来的BMW对象在内存中的地址 车的颜色为:白色 车轮胎数为:4
__str__()方法
11 #定义汽车类 12 class Car(): 13 14 def __init__(self,wheelNum,color): 15 self.wheelNum = wheelNum 16 self.color = color 17 def move(self): 18 print('车子在跑...') 19 20 def __str__(self): 21 return "车子的颜色是:%s,轮胎数是:%d"%(self.color,self.wheelNum) 22 23 #创建对象 24 BMW = Car(4,'白色') 25 print(BMW) 26 print('车的颜色为:%s'%BMW.color) 27 print('车轮胎数为:%d'%BMW.wheelNum)
总结:
1)在python中方法名如果是__xxxx__()的, 那么就有特殊的功能,因此叫做“魔法”方法
2)当使用print输出对象的时候,只要自己定义了__str__(self)方法,那么就会打印从在这个方法中return的数据
理解self
看以下示例:
11 #定义一个类 12 class Animal(): 13 14 #方法 15 def __init__(self,name): 16 self.name = name 17 18 def printName(self): 19 print('名字为:%s'%(self.name)) 20 21 #定义一个函数 22 def myPrint(animal): 23 animal.printName() 24 25 dog1 = Animal('旺财') 26 myPrint(dog1) 27 dog2 = Animal('来福') 28 myPrint(dog2)
运行结果:
名字为:旺财
名字为:来福
总结:
1)所谓的self,可以理解为自己
2)可以把self当做C++中类里面的this指针一样理解,就是对象自身的意思
3)某个对象调用其方法时,python解释器会把这个对象作为第一个参数传递给self,所以开发者只需要传递后面的参数即可