Python中的面向对象编程
一.面向对象简述
面向对象编程—— 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
Tiger
与Cat
为Animal
的子类,Animal
为其父类,将所有属性,方法传递给Tiger
,Bird
.
tiger = Tiger('tiger','cat',6,'femail')
tiger.sleep()
bird = Bird('bird','fly',6,'mail')
bird.sleep()
运行效果如下:
注意:
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))
六.多继承原理
# 经典类
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()