python面向对象

定义

1、类:我们把一类相同的事物叫做类,其中用相同的属性(其实就是变量)描述,里面封装了相同的方法。

 两个要素:属性

      方法

2、对象:类的实例化就是对象。

面向对象的三大特性

1、封装

例:车是一个类,车的品牌、价格是它的属性,在路上跑是它的行为 

1 class Car():    
2     def __init__(self,type,price,distance):
3          self.type = type
4          self.price = price
5          self.distance = distance      #汽车开始里程数
6  
7      def drivedistance(self,distance):    #汽车此次跑的里程数
8           self.distance -=distance

上述代码定义了Car类,并在Car类中定义了三个属性,一个方法,这种将同一事物的多个属性和行为封装成一个类的方式就是面向对象的封装性。

1.1 类的相关概念:

(1)构造函数:

def __init__(self,...):

(2)析构函数:

def __del__(self,...):

(3)两个内建函数

  • dir()获取对象的属性
  • type()获取对象的类型

1.2 定义类的属性:

(1)直接在类里定义

class Programer(object):
    sex = 'male'

该属性会被所有类的对象使用,并且sex值在不更改的情况下都为‘male’

(2)在构造函数里定义

class Programer(object):
    def __init__(self,name,age):
        self.name = name
        self,age = age

每个不同的对象,属性值可以不一样

注意:python不提供私有属性,在属性前加__并不是真正的实现私有属性,如果想访问,仍然可以访问,只不过需要查看它在python内部的属性名称,可通过dir()获取

1.3 定义类的方法

(1)函数和方法的区别:

  • 函数直接用函数名调用
  • 方法是类的一部分,可被对象调用

(2)常用的方法定义

class Example(object):
    def add(self):
        pass
    
    def _minue(self):
        pass

    def __multiply(self):
        pass

(3)方法装饰器

  • @classmethod:调用的时候用类名,而不是某个对象
  • @property:像访问属性一样调用方法

(4)举例:

class Programer(object):
    hobby = 'Play Computer'

    def __init__(self,name,age,weight):
        self.name = name
        self._age = age
        self.__weight = weight

    @classmethod
    def get_hobby(cls):
        return cls.hobby

    @property
    def get_weight(self):
        return self.__weight

    def self_introduction(self):
        print "my name is %s 
 I am %d years old
"%(self.name,self._age)

if __name__ == '__main__':
    pro = Programer("ABC",15,80)
print dir(pro) print Programer.get_hobby() print pro.get_weight pro.self_introduction()

运行结果:

2、继承

(1)单继承:派生类继承基类,也叫子类继承父类,派生类可以继承父类的所有属性和方法(私有属性和私有方法除外)

(2)多继承:一个派生类可以继承多个基类的方法和属性,若继承的方法或属性同名时,则要考虑是深度优先还是广度优先。

                      
  • 深度优先

 (1)何时深度优先?

    当类是经典类时,多继承情况下,会按照深度优先方式查找。    

 

 (2)什么是经典类?

   不继承自object类的类。    

 (3)什么是深度优先?

   如上图,首先B类和C类继承自D类,A类又继承自B、C(class A(B,C)),对象在调用同名方法时会以A类-->B 类-->D类-->C类的顺序调用,先找到谁,就调用谁。 

  • 广度优先

 (1)何时广度优先?

   当类是新式类时,多继承情况下,会按照广度优先方式查找。    

 (2)什么是新式类?

   继承自object类的类。   

 (3)什么是广度优先?

   如上图,首先B类和C类继承自D类,A类又继承B、C(class A(B,C)),对象在调用同名方法时会以A类-->B类-->C类-->D类的顺序调用,先找到谁调用谁。

注:新式类VS经典类

    Python 2.x中默认都是经典类,只有显式继承了object才是新式类

    Python 3.x中默认都是新式类,不必显式的继承object

  用途:实现代码的重用,相同代码不需要重复编写。

3、多态

(1)定义:不同子类对象调用相同的父类方法,产生不同的执行结果。

(2)优点:多态可以增加代码的灵活度,以继承和重写父类方法为前提。

原文地址:https://www.cnblogs.com/chunqiu666/p/12767607.html