12-面向对象1

Posted 每天进步一点点

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了12-面向对象1相关的知识,希望对你有一定的参考价值。

定义类

定义一个类,格式如下:

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,所以开发者只需要传递后面的参数即可

以上是关于12-面向对象1的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段12——JavaScript的Promise对象

VSCode自定义代码片段12——JavaScript的Promise对象

并发技术12线程锁技术的使用

Java中面向对象的三大特性之封装

python之路之前没搞明白4面向对象(封装)

1.12 面向对象