在开发过程中,有些代码需要多人编写,代码的可读性很重要,为了提高代码的复用性,方便后期维护,这时候就需要考虑面向对象的实现。本文介绍了面向对象的相关知识以及类的创建和使用。本文也是Python系列文章的第4篇。
【Python 基础】一文补齐Python基础知识
【趣学Python:B站四大恶人】一文掌握列表、元组、字典、集合
【Python进阶】一文掌握Python函数用法
【Python进阶】Python面向对象之类与对象详解
【Python进阶】Python面向对象之装饰器与封装详解
【Python进阶】Python面向对象之继承和多态详解
【Python进阶】Python异常处理和模块详解
【Python进阶】Python文件(I/O)操作详解
Python是一门面向对象的编程语言;
所谓的面向对象的语言,简单理解就是语言中的所有操作都是通过对象来进行的;
相对地,还有面向过程的编程的语言。面向过程指将我们的程序的逻辑分解为一个一个的步骤,通过对每个步骤的抽象,来完成程序。
面向过程的编程思想将一个功能分解为一个一个小的步骤,我们通过完成一个一个的小的步骤来完成一个程序。这种编程方式,符合我们人类的思维,编写起来相对比较简单;但是这种方式编写代码的往往只适用于一个功能,如果要在实现别的功能,即使功能相差极小,也往往要重新编写代码,所以它可复用性比较低,并且难于维护。
面向对象的编程语言,关注的是对象,而不关注过程。对于面向对象的语言来说,一切都是对象。
面向对象的编程思想,将所有的功能统一保存到对应的对象中,要使用某个功能,直接找到对应的对象即可。这种方式编写的代码,比较容易阅读,并且比较易于维护,容易复用。但是这种方式编写,不太符合常规的思维,编写起来稍微麻烦一点。
int()
、 float()
、 bool()
、 str()
、 list()
、 dict()
… 这些都是类;a = int(10)
创建一个int
类的实例,等价于 a = 10
;a = int(10) # 创建一个int类的实例
b = str('Hello world') # 创建一个str类的实例
print(a , type(a)) #-->10
print(b , type(b)) #-->Hello world
'''
使用class关键字来定义类:
class 类名([父类]):
代码块
'''
class MyClass():
pass
print(MyClass) #-->
inst = MyClass() # inst就是通过MyClass创建的对象,inst是MyClass的实例
inst_2 = MyClass()
inst_3 = MyClass()
# inst inst_2 inst_3 都是MyClass的实例,他们都是一类对象;
isinstance()
用来检查一个对象是否是一个类的实例;result = isinstance(inst,MyClass)
result_2 = isinstance(inst,str)
print('result =',result) #-->result = True
print('result =',result) #-->result = False
print(id(MyClass) , type(MyClass))
1887555534648 <class 'type'>
1.创建一个变量inst;
2.在内存中创建一个新对象;(实例由哪个类创建,type就是哪个类的type)
3.将对象的id
赋值给变量;
通过MyClass这个类创建的对象都是一个空对象,也就是对象中什么都没有,相当于一个空盒子,可以向对象中添加变量,对象中的变量称为属性。语法:对象.属性名 = 属性值
;
inst.name = '孙悟空'
inst_2.name = '猪八戒'
print(inst.name)
print(inst_2.name)
类和对象都是对现实生活中的事物或程序中的内容的抽象;
实际上所有的事物都由两部分构成:
1.数据(属性)
2.行为(方法)
在类的代码块中,我们可以定义变量和函数;
变量 会成为该类实例的 公共属性,所有的该类实例都可以通过 对象.属性名
的形式访问;
函数 会成为该类实例的 公共方法,所有该类实例都可以通过 对象.方法名()
的形式调用方法;
注意:
方法调用时,第一个参数由解析器自动传递,所以定义方法时,至少要定义一个形参!比如Person
类中,def say_hello(self)
中的self
;
实例能访问到类中的属性和方法的原因:类中定义的属性和方法都是公共的,任何该类实例都可以访问。
属性和方法查找的流程:
当我们调用一个对象的属性时,解析器会先在当前对象中寻找是否含有该属性,如果有,则直接返回当前的对象的属性值;如果没有,则去当前对象的类对象中去寻找,如果有则返回类对象的属性值;如果类对象中依然没有,则报错!
类对象和实例对象中都可以保存属性(方法)
如果这个属性(方法)是所有的实例共享的,则应该将其保存到类对象中;
如果这个属性(方法)是某个实例独有的,则应该将其保存到实例对象中;
一般情况下,属性保存到实例对象中,而方法需要保存到类对象中;
# 尝试定义一个表示人的类
class Person:
'''
在类的代码块中,我们可以定义变量和函数;
在类中我们所定义的变量,将会成为所有的实例的公共属性;
所有实例都可以访问这些变量;
在类中也可以定义函数,类中的定义的函数,我们称为方法;
这些方法可以通过该类的所有实例来访问;
'''
name = '孙悟空' # 公共属性,所有实例都可以访问
def say_hello(self) :
'''
方法每次被调用时,解析器都会自动传递第一个实参;
第一个参数,就是调用方法的对象本身;
如果是p1调的,则第一个参数就是p1对象;
如果是p2调的,则第一个参数就是p2对象;
一般我们都会将这个参数命名为self;
say_hello()这个方法,可以显示如下格式的数据:
你好!我是 xxx
在方法中不能直接访问类中的属性,需要使用self.xx的形式;
'''
print('你好!我是 %s' %self.name)
# 创建Person的实例
p1 = Person()
p2 = Person()
属性修改
# 修改p1的name属性
p1.name = '猪八戒'
p2.name = '沙和尚'
p1.say_hello() # '你好!我是 猪八戒'
p2.say_hello() # '你好!我是 沙和尚'
del p2.name # 删除p2的name属性
print(p1.name)
class Person :
name = '孙悟空'
def say_hello(self):
print('你好!我是 %s' %self.name)
p1 = Person()
p1.name = '猪八戒'
p1.say_hello() #-->大家好,我是猪八戒
1.目前来讲,对于Person
类来说name
是必须的,并且每一个对象中的name
属性基本上都是不同的;
2.而我们现在是将name
属性在定义为对象以后,手动添加到对象中,这种方式很容易出现错误;我们希望,在创建对象时,必须设置name属性,如果不设置对象将无法创建,并且属性的创建应该是自动完成的,而不是在创建对象以后手动完成。
class Person:
'''
在类中可以定义一些特殊方法(魔术方法);
特殊方法都是以__开头,__结尾的方法;
特殊方法不需要我们自己调用,不要尝试去调用特殊方法;
特殊方法将会在特殊的时刻自动调用;
'''
def __init__(self):
# 通过self向新建的对象中初始化属性
self.name = '孙悟空'
def say_hello(self):
print('大家好,我是%s'%self.name)
p2 = Person()
p2.say_hello() #-->大家好,我是孙悟空
p1 = Person()
的运行流程如下:
p1
;__init__(self)
方法执行;id
赋值给变量p1
;init
会在对象创建以后立即执行;init
可以用来向新创建的对象中初始化属性;init()
中;进一步,保证调用的灵活性,简化对象的创建,设置__init__
传入参数:
class Person:
'''
在类中可以定义一些特殊方法(魔术方法);
特殊方法都是以__开头,__结尾的方法;
特殊方法不需要我们自己调用,不要尝试去调用特殊方法;
特殊方法将会在特殊的时刻自动调用;
'''
def __init__(self,name):
# 通过self向新建的对象中初始化属性
self.name = name
def say_hello(self):
print('大家好,我是%s'%self.name)
p3 = Person('孙悟空')
p3.say_hello() #-->大家好,我是孙悟空
p4 = Person('猪悟能')
p4.say_hello() #-->大家好,我是猪悟能
p5 = Person('沙悟净')
p5.say_hello() #-->大家好,我是沙悟净
class 类名([父类]) :
#公共属性...
# 对象的初始化方法
def __init__(self,...):
...
# 其他的方法
def method_1(self,...):
...
def method_2(self,...):
...
...
属性:
方法:
class Dog:
'''
表示狗的类
'''
def __init__(self, breed, name, age, gender, height, weight):
self.breed = breed
self.name = name
self.age = age
self.gender = gender
self.height = height
self.weight = weight
def bark(self):
'''
狗叫的方法
'''
print('%s 在冲着你叫~~'%self.name)
def bite(self):
'''
狗咬的方法
'''
print('%s 在咬你~~'%self.name)
def lick(self):
'''
狗舔的方法
'''
print('%s 在舔你~~'%self.name)
def run(self):
'''
狗跑的方法
'''
print('%s 在跑向你~~'%self.name)
def jump(self):
'''
狗跳的方法
'''
print('%s 在跳~~'%self.name)
your_dog = Dog('中华田园犬', '旺财', 3, 'male', '50cm', '25kg')
your_dog.bark() #-->旺财 在冲着你叫~~
参考:https://edu.aliyun.com/course/1782