python高级-面向对象(11)

1、面向过程和面向对象

  • 面向过程:根据业务逻辑从上到下写代码
  • 面向对象:将数据与函数绑定到一块儿,进行封装,这样可以更快速的开发程序,减小了重复代码的重写过程

2、类和对象

一、类的概念python

面向对象编程的2个很是重要的概念:类和对象是面向对象编程的核心。编程

在使用对象的过程当中,为了将具备共同特征和行为的一组对象抽象定义,提出了另一个新的概念——类安全

  1. 类是对象的模板,例如:人类,是人这种生物的模板。
  2. 类是一个抽象的概念,是一类事物的合集。

例如:人类,汽车类,鸟类,狗类,都是多个具备相同特征事物的合集概念。函数

二、对象的概念(万事万物皆对象)this

对象是具体事物,具备惟一性,必定能肯定是哪个的就是对象。spa

例如:周杰伦、地球、老王的宝马、小李的泰迪设计

  • 大众汽车(类):没办法肯定那一辆,大众生产的都叫奔驰汽车
  • 大众宝来汽车(类):大众宝来也是全部宝来汽车的类,只不过比大众汽车的范围小一点而已,也能够理解为大众宝来汽车类是大众汽车类的子类。
  • 个人大众汽车(对象):能够肯定,由于我就一辆大众汽车。不会有人卖两辆大众吧,若是有还不如去买一辆奥迪是否是。
  • 大黄狗(类):由于全部大一点的黄色的都叫大黄狗,没办法肯定哪个
  • 金毛(类):金毛也是一类狗的统称,没办法肯定惟一的一个。
  • 个人金毛(对象):能够肯定,具备惟一性。

 

3、类的构成

类(Class) 由3个部分构成指针

  • 类的名称:类名
  • 类的属性:一组数据
  • 类的方法:容许对进行操做的方法 (行为)

狗类的设计code

  • 类名:狗(Dog)
  • 属性:品种 、毛色、性别、名字、 腿的数量
  • 方法(行为/功能):叫 、跑、咬人、吃、摇尾巴

 

4、定义类

定义一个类,格式以下:对象

class 类名: 方法列表

举个例子:定义一个Car类

#定义类
class Car: #方法
    def getCarInfo(self): print("这是一辆%s牌汽车"%self.name) def move(self) print("车正在移动")

说明:

  • 定义类有2种:新式类和经典类(基类),上面Car为经典类(基类),若是是Car(object)则为新式类
  • 类名的命名规则遵循驼峰制

 

5、定义对象

经过上面,定义了一个Car类;就比如有车一个张图纸,那么接下来就应该把图纸交给生成工人们去生成了

python中,能够根据已经定义的类去建立出一个个对象

建立对象的格式为:

对象名 = 类名()

建立对象demo

#定义类
class Car: def move(self): print("车在奔跑") #建立对象
BMW = Car() #对象调用方法
BMW.move() #给对象添加属性
BMW.name = "宝马"
#经过点语法调用对象属性
print(BMW.name)

运行结果为:

车在奔跑
宝马

说明:

  • BMW = Car(),这样就产生了一个Car的实例对象,此时也能够经过实例对象BMW来访问属性或者方法
  • 第一次使用BMW.name = “宝马”表示给BMW这个对象添加属性,若是后面再次出现BMW.name= xxx表示对属性进行修改
  • BMW是一个对象,它拥有属性(数据)和方法(函数)
  • 当建立一个对象时,就是用一个模子,来制造一个实物

 

6、_ _init_ _()方法

在上一面的demo中,咱们已经给BMW这个对象添加了1个属性name,试想若是再次建立一个对象的话,确定也须要进行添加属性,显然这样作很费事,那么有没有办法可以在建立对象的时候,就顺便把车这个对象的属性给设置呢?

答案就是:_ _init_ _()方法

一、使用方法

class 类名: #初始化方法,用来完成一些默认的设定
    def __init__(): pass

二、_ _init_ _()方法的调用

class Car: def __init__(self): self.name = "宝马"
    def move(): print("车在跑") #建立对象
bmw = Car() print("这是一辆%s牌汽车"%bmw.name)

运行结果为:这是一辆宝马牌汽车

说明:当建立Car对象后,在没有调用__init__()方法的前提下,bmw就默认有了name属性为宝马

三、自定义_ _init_ _()方法

class Car: def __init__(self,newName,newColor): self.name = newName self.color = newColor def move(): print("车在跑") #建立对象
bmw = Car("宝马","黑色") print("这是一辆%s牌汽车"%bmw.name) print("这辆汽车的颜色是%s"%bmw.color)

运行结果为:

这是一辆宝马牌汽车
这辆汽车的颜色是黑色

说明:

  • __init__()方法,在建立一个对象时默认被调用,不须要手动调用
  • __init__()方法,默认有一个参数名self,若是在建立对象时须要传递2个参数,那么__init__()中self做为第一个参数外还须要2个参数,例如__init__(self,x,y)
  • __init__()方法,中的self参数,不须要开发者传递,python解释器会自动把当前对象的引用传递进去

 

7、_ _str_ _()方法

class Car: def __init__(self,newName,newColor): self.name = newName self.color = newColor def move(): print("车在跑") def __str__(self): msg = "你好,我是一辆%s的%s牌汽车"%(self.color,self.name) return msg #建立对象
bmw = Car("宝马","黑色") print(bmw)

运行结果为:你好,我是一辆黑色的宝马牌汽车

说明:

  • 在python中方法名若是是__XXX__()的,那么就有特殊的功能,所以叫作“魔法”方法
  • 当使用print输出对象的时候,只要本身定了__str__()方法,那么就会打印这个方法中的return的数据

 

8、self

  • 所谓self,能够理解为本身
  • 能够把self当作C++或者Java中的this指针同样理解,就是对象自己的意思
  • 某个对象调用__init__()方法时,python解释器会把这个对象做为第一个参数传递给self,因此开发者只须要传递后面的参数便可

 

9、属性的set和get方法

若是有一个对象,当须要对其进行修改属性时,有2种方法

  • 对象名.属性名 = 数据 —->直接修改
  • 对象名.方法名() —->间接修改

为了更好的保存属性安全,即不能随意修改,通常的处理方式为

  • 将属性定义为私有属性
  • 添加一个能够调用的方法,供调用
 1 class Person(object):  2     def __init__(self, name):  3         #以__开头的属性表示私有属性,不容许外部访问
 4         self.__name = name  5 
 6     def getName(self):  7         return self.__name
 8 
 9     def setName(self,newName): 10         if len(newName)>=5: 11             self.__name = newName 12         else: 13             print("Error:输入的名字长度不够") 14 
15 xiaoming = Person("Se7eN_HOU") 16 print(xiaoming.__name)

运行结果为:

Traceback (most recent call last): File "C:\Users\Se7eN_HOU\Desktop\demo.py", line 16, in <module>
    print(xiaoming.__name) AttributeError: 'Person' object has no attribute '__name'

修改成以下代码:

class Person(object): def __init__(self, name): #以__开头的属性表示私有属性,不容许外部访问
        self.__name = name def getName(self): return self.__name

    def setName(self,newName): if len(newName)>=5: self.__name = newName else: print("Error:输入的名字长度不够") xiaoming = Person("Se7eN") xiaoming.setName("Se7eN_HOU") print(xiaoming.getName()) xiaoming.setName("HOU") print(xiaoming.getName())

运行结果为:

Se7eN_HOU
Error:输入的名字长度不够
Se7eN_HOU

说明:

  • Python中没有像C++中public和private这些关键字来区别公有属性和私有属性
  • 它是以属性命名方式来区分,若是在属性名前面加了2个下划线’__’,则代表该属性是私有属性,不然为公有属性(方法也是同样,方法名前面加了2个下划线的话表示该方法是私有的,不然为公有的)。

 

10、_ _del_ _()方法

建立对象后,python解释器默认调用_ _init_ _()方法;

当删除一个对象时,python解释器也会默认调用一个方法,这个方法为_ _del_ _()方法

class Person(object): #初始化方法,建立对象会被自动调用
    def __init__(self, name): print("__init__方法被调用") self.__name = name #析构方法:当对象删除是会被调用
    def __del__(self): print("__del__方法被调用") def getName(self): return self.__name

    def setName(self,newName): if len(newName)>=5: self.__name = newName else: print("Error:输入的名字长度不够") xiaoming = Person("Se7eN") print("------立刻删除xiaoming------") del xiaoming laowang = Person("laowang") laowang2 = laowang laowang3 = laowang print("------立刻删除laowang------") del laowang print("------立刻删除laowang2------") del laowang2 print("------立刻删除laowang3------") del laowang3

运行结果为:

__init__方法被调用
------立刻删除xiaoming------
__del__方法被调用
__init__方法被调用
------立刻删除laowang------
------立刻删除laowang2------
------立刻删除laowang3------
__del__方法被调用

说明:

  • 当有1个变量保存了对象的引用时,此对象的引用计数就会加1
  • 当使用del删除变量指向的对象时,若是对象的引用计数不为1,好比3,那么此时只会让这个对象的引用计数减1,即变为2,当再次调用del时,变为1,若是在调用1次的时候,此时才会把对象删除
相关文章
相关标签/搜索