前言
文中例子有点长,但这是为了将python的对象特点尽量体现在代码中,个人觉得比那种简单的例子更具有代表性!
Python作为一种解释型脚本语言,“优雅”、“明确”、“简单”是其哲学。
而很重要的一点就是,python是完全面向对象编程。函数、模块、数字、字符串都是对象。并且完全支持继承、重载、派生、多继承,有益于增强源代码的复用性。
一、面向对象是什么?
当我们接触过面向对象语言C++、Java等面向对象语言,就肯定对面向对象这种软件开发方法有所了解,就是利用抽象、封装等机制,借助于对象、类、继承、消息传递等概念进行软件系统构造的软件开发方法。如果你已经接触过面向对象编程语言,可以直接跳过此处面向对象技术简介直接进入python对象教程。
面向对象技术简介:
类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
数据成员:类变量或者实例变量, 用于处理类及其实例对象的相关的数据。
方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
局部变量:定义在方法中的变量,只作用于当前实例的类。
实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
实例化:创建一个类的实例,类的具体对象。
方法:类中定义的函数。
对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
此处直接引用菜鸟教程对面向对象技术的简介:原文地址
二、python面向对象
1.python类基本语法
语法
class 类名:
属性
构造方法
方法
实列代码如下(示例):
定义一个类people,具体如下:
UML类图如下:
# 定义一个people类,而people具有以下特征
# 名字、性别、身高、体重等
class people:
# 四个属性变量
name = "unknown"
height = 0
weight = 0
sex ="unknown"
# 私有属性,比如role
# 而python私有属性用双下划线__
# 代表该变量role属性只能在类中进行调用使用,而实例化对象引用是错的
__role = "This is a private variablee"
# __init__()方法是类的构造函数(初始化方法)
def __init__(self,n,h,w,s):
# self 代表类的实例(用于传入相应参数)
self.name = n
self.height = h
self.weight = w
self.sex = s
# 类中方法,此处定义了一个自我介绍的方法
def introduce(self):
print("I am human! My name is {}".format(self.name))
# 吃饭方法
def eat(self):
print("{}正在吃饭!".format(self.name))
# 调用私有变量的方法
def role(self):
print(self.__role)
# people类的第一个实例化例对象 Calvin
Calvin = people("Calvin",175,60,"gril")
Calvin.introduce()
Calvin.eat()
print("{} H:{} W:{} S:{}".format(Calvin.name,
Calvin.height,Calvin.weight,Calvin.sex))
# 对当前对象直接调用类中私有属性是错的,只能通过对象在内调用私有属性
# print(Calvin.__role)
Calvin.role()
输出结果如下:
I am human! My name is Calvin
Calvin was at dinner!
Calvin H:175 W:60 S:gril
This is a private variablee
2.继承
当多个类具有重复属性时,我们可以使用继承,比如此时要写一个GrilFriend类,而GrilFriend肯定是一个人…所以,她具有上面people类的属性,如名字、身高、体重等,而此时像这种大家都具有的统一属性行为特点如果都写一遍的话会增加代码的编写量,因此我们使用一个父类进行统一,再使用继承的方式即可,使GrilFriend类继承people类属性。这样能够减少代码的重复编写,简化代码,提高代码的可用性
语法定义:
1.继承定义
python继承语法: def 子类名(继承父类名):
2.继承构造函数 (2种方法)
经典写法 :父类名称.init(self,参数1,参数2,…)
super关键字写法: super(子类,self).init(参数1,参数2,…)
3.继承父类方法和重写
UML类图如下:
‘真面向“对象”编程~~
# 定义一个女朋友类,继承people属性,pytho继承语法: def 子类名(继承父类名):
class GrilFriend(people):
# 同时对女朋友类增加新属性:性格
character = ""
# 定义Gril类构造方法
def __init__(self,n,h,w,s,c):
# 继承父类的构造方法
# 1.经典类的写法: 父类名称.__init__(self,参数1,参数2,...)
# people.__init__(self, n, h, w, s)
# 2. super关键字写法:super(子类,self).__init__(参数1,参数2,....)
super(GrilFriend,self).__init__(n,h,w,s)
self.character = c
# 方法重写
# 因为GrilFriend 继承people类中所有公有属性和方法
# 我们这里introduce方法进行重写
def introduce(self):
print("I am a beautiful girl!")
def walk(self):
print("{} was taking a walk!".format(self.name))
# 实例化对象:
# 同样,定义一个GrilFriend类对象 Ashley
Ashley = GrilFriend("Ashley", 160, 50,"gril","gentle")
# 调用重写后的自我介绍方法
Ashley.introduce()
# 因为GrilFriend类继承People类,所以可以直接调用其父类的方法使用
Ashley.eat()
print("{} H:{} W:{} S:{} C:{}".format(Ashley.name,Ashley.height,
Ashley.weight,Ashley.sex,Ashley.character))
输出结果如下:
I am a gentle girl!
Ashley was at dinner!
Ashley H:160 W:50 S:gril C:gentle
4.多继承
python支持多继承,包括单继承、多重继承、不同类继承同一个类、一个类继承多个类。这里一个类多继承其他多个类属性,在java中是不支持的,而python中却支持,如C继承A的同时,C还可以继承B。
此处只举例不同python与java不同的多继承,其他类似java。
假设,此时GrilFriend本身既是一个人,满足people类,同时也是一个学生,满足我们定义的student类。所以此时GrilFriend可以同时继承people和student两个类。
UML类图如下:
# 定义一个people类,而people具有以下特征
# 名字、性别、身高、体重等
class people:
# 四个属性变量
name = "unknown"
height = 0
weight = 0
sex ="unknown"
# 私有属性,比如role
# 而python私有属性用双下划线__
# 代表该变量role属性只能在类中进行调用使用,而实例化对象引用是错的
__role = "This is a private variablee"
# __init__()方法是类的构造函数(初始化方法)
def __init__(self,n,h,w,s):
# self 代表类的实例(用于传入相应参数)
self.name = n
self.height = h
self.weight = w
self.sex = s
# 类中方法,此处定义了一个自我介绍的方法
def introduce(self):
print("I am human! My name is {}".format(self.name))
# 吃饭方法
def eat(self):
print("{} was at dinner!".format(self.name))
# 调用私有变量的方法
def role(self):
print(self.__role)
#定义一个学生类
class student():
school = ""
def __init__(self,sc):
self.school = sc
def s_introduce(self):
print("I am a student!")
# 定义一个女朋友类,继承people属性,pytho继承语法: def 子类名(继承父类名):
# 而此时GrilFriend多重继承 people和 student
class GrilFriend(people,student):
# 同时对女朋友类增加新属性:性格
character = ""
# 定义Gril类构造方法
def __init__(self,n,h,w,s,c,sc):
# 继承父类的构造方法
# 1.经典类的写法: 父类名称.__init__(self,参数1,参数2,...)
# people.__init__(self, n, h, w, s)
# 2. super关键字写法:super(子类,self).__init__(参数1,参数2,....)
# 继承people构造方法
super(GrilFriend,self).__init__(n,h,w,s)
# 继承
student.__init__(self,sc)
self.character = c
# 方法重写
# 因为GrilFriend 继承people类中所有公有属性和方法
# 我们这里introduce方法进行重写
def introduce(self):
print("I am a {} girl!".format(self.character))
def walk(self):
print("{} was taking a walk!".format(self.name))
# 同样,定义一个GrilFriend类对象 Ashley
Ashley = GrilFriend("Ashley", 160, 50,"gril","gentle","university")
# 调用重写后的自我介绍方法
Ashley.introduce()
# 因为GrilFriend类继承People类,所以可以直接调用其父类的方法使用
Ashley.eat()
print("{} H:{} W:{} S:{} C:{}".format(Ashley.name,Ashley.height,
Ashley.weight,Ashley.sex,Ashley.character))
#多重继承第二个student类
print(Ashley.school)
Ashley.s_introduce()
输出结果如下:
I am a gentle girl!
Ashley was at dinner!
Ashley H:160 W:50 S:gril C:gentle
university
I am a student!
由上面代码输出可以看到,GrilFriend同时继承了people和student两个类的属性,这就是python多继承的例子。当然,这个例子是简单的。因为python有了多继承的特点,所以多了很多关于继承的设计模式,如Mixin模式,此处只做继承简介~~
总结
python学习到这里,不知不觉已经将基础部分学完了,然后开始学习数据分析和爬虫…很多没来得及写博客,毕竟写博客是费时间的,知识点讲解,例子引入等。在记录自己学习过程的同时,也希望能帮同为python萌新的学习者解惑,哪怕是一丢丢,这件事也显得有价值。
路过的大佬点个赞,码字不易,谢谢支持!