一.面向对象简述

面向对象编程—— Object Oriented Programming , 简称 OOP,是一种程序设计思想。 OOP
把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
在 Python 中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据
类型就是面向对象中的类(Class)的概念。

分为:

  • 类:一个模板,(动物) —–是一个抽象的,没有实体的
  • 对象:(类中的某一个实体,eg:狮子,老虎)
  • 属性:(表示这类东西的特征,眼睛,嘴,鼻子)===> __init__
  • 方法:(表示这类物体可以做的事情,eg: 吃饭,睡觉,捕猎)

特点:

数据封装、继承、和多态

二.类(class)与对象(类实例化)

面向对象最重要的概念就是类( Class ) 和实例( Instance ),类是抽象的模板。
建立Animal类:

class Animal(object):
    #构造方法(魔术方法),当创建对象时,自动执行的函数。
    def __init__(self,name,department,age,gender):
        self.department = department
        self.name = name
        self.age = age
        self.gender = gender
    #方法(在类里面定义的函数,叫做方法)
    def sleep(self):
        print("%s is sleeping." %(self.name))
#创建对象=====>根据模板(类)创建对象(真实存在)
Simba = Animal(Simba,lion,8,mail)
#查看对象的属性
print(Simba.name)
print(Simba.department)
#让对象执行的方法
Simba.sleep()

class为类的关键词。后面接的为类名,即Animal,类名首字母大写,object代表是,动物继承于哪一个类,如果不知道继承哪个类,就写object
由于类可以起到模板的 作用,因此,在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去。通过定义一个特殊的 __init__ 方法,在创建实例的时候,就把name,department,age,gender等属性绑上去。
类的私有属性:
两个下划线开头,声明该属性为私有( 例:__p[rivate)
不能在类地外部被使用或直接访问。
在类内部的方法中使用时 self.__private_attrs

类的方法:
在类的内部,使用 def 关键字来定义一个方法,与一般函数定义不同,
类方法必须包含参数 self,且为第一个参数,self 代表的是类的实例。
self 的名字并不是规定死的(因为是形参),也可以使用 this,但是最好还是按照约定是用 self。

类的私有方法:
__private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 , 不能在类地外部调用。self.__private_methods。

三.数据封装

面向对象一个重要的特点。实例即拥有各自的属性数据,可以通过函数访问这些数据。实例本身就拥有这些数据,要访问这些数据,就没有必要从外面的函
数去访问,可以直接在 Student 类的内部定义访问数据的函数,这样,就把“数据”给封装起来了。这些封装数据的函数是和 Student 类本身是关联起来的,我们称之为类的方法。
定义一个方法,除了比一般函数多需要一个self参数,其他别无二致。要调用一个方法,只需要在实例变量上直接调用,除了 self 不用传递,其他参数正常传入。

四.继承

概念:父类与子类/基类和派生类。

定义一个 class 的时候,可以从某个现有的 class 继承,新的class 称为子类、派生类,而被继承的 class 称为基类、父类。

例:上文定义了一个Animal的类.这里建立一个子类直接继承其属性,方法。

class Tiger(Animal):
    pass
class Bird(Animal):
    pass

TigerCatAnimal的子类,Animal为其父类,将所有属性,方法传递给Tiger,Bird.

tiger = Tiger('tiger','cat',6,'femail')
tiger.sleep()
bird = Bird('bird','fly',6,'mail')
bird.sleep()

运行效果如下:

python 面向对象 类 python中的面向对象编程_父类

注意:
1.如果子类没有的属性和方法, 则去父类找, 如果父类也没有, 就报错
2.父类的私有属性, 子类的方法时不能查看与操作

五.多态

在继承关系中,如果一个实例的数据类型是某个子类,那它的数据类型也可以被看
做是父类。但是,反过来就不行。

a = dict()
b = Animal()
c = Tiger()
d = Bird()
print(isinstance(a,dict))
print(isinstance(b,Tiger))
print(isinstance(c,Animal))
print(isinstance(d,Bird))

python 面向对象 类 python中的面向对象编程_数据_02


python 面向对象 类 python中的面向对象编程_python 面向对象 类_03

六.多继承原理

# 经典类
class Person1:
    pass
p1 = Person1()
print(p1)

# 新式类
class Person2(object):
    pass
p2 = Person2()
print(p2)

新式类方法与属性继承时 子类使用广度优先算法,经典类方法与属性继承时,子类使用深度优先算法

# python3全部都是新式类;
class D:
    def test(self):
        print("D test")
class C(D):
    pass
    def test(self):
        print("C test")
class B(D):
    pass
    # def test(self):
    #     print("B test")
class A(B,C):
    pass
    # def test(self):
    #     print("A test")
a = A()
a.test()

python 面向对象 类 python中的面向对象编程_数据_04