欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python精讲之面向对象(1)

程序员文章站 2022-06-15 10:18:16
文章目录基本概念面向过程类(class)类的创建基本概念数据封装、继承和多态是面向对象的三大特点面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。Python是⼀⻔⾯向对象的编程语⾔所谓⾯向对象的语⾔,简单理解就是语⾔中的所有操作都是通过对象来进⾏ 的对象概念可参考https://blog.csdn.net/xdc1812547560/article/details/107...

基本概念

数据封装、继承和多态是面向对象的三大特点

  • 面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想。OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数。
  • Python是⼀⻔⾯向对象的编程语⾔
  • 所谓⾯向对象的语⾔,简单理解就是语⾔中的所有操作都是通过对象来进⾏ 的
    对象概念可参考https://blog.csdn.net/xdc1812547560/article/details/107512610

面向过程

  • ⾯向过程指将我们的程序分解为⼀个⼀个步骤,通过对每个步骤的抽象来 完成程序
      比如:将大象装进冰箱需要几步:
      第一步:打开冰箱
      第二步:将大象装进去
      第三步:关上冰箱 
  • 面向过程的程序设计把计算机程序视为一系列的命令集合,即一组函数的顺序执行。为了简化程序设计,面向过程把函数继续切分为子函数,即把大块函数通过切割成小块函数来降低系统的复杂度。
  • 而面向对象的程序设计把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递。
  • 在Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。

类(class)

  • 面向对象最重要的概念就是类(Class)和实例(Instance),必须牢记类是抽象的模板,比如Student类,而实例是根据类创建出来的一个个具体的“对象”,每个对象都拥有相同的方法,但各自的数据可能不同。

python中有很多自己的内置对象,比如int(),str(),float()…

a = 10 == a = int(10)  == 创建了一个int类的实例
a = 'hello world' == a =str('hello world') == 创建了一个str类的实例

但是仅仅靠内置对象不足以满足我们的需求,所以需要我们自己定义对象

  • 对象是类的实例(instance) 如果多个对象是通过⼀个类创建的,我们称这些对象是⼀类对象
  • 类也是⼀个对象,类就是⽤来创建对象的对象

类的创建

定义一个类,其实可以算是定义了一个type类型的对象,也就是说,创建了一个对象,而对象的类型type是class(类)
语法:

class 类名(父类)#类的属性
	name = '程序猿'
	#类的方法
	def joke(self):
		print('创建类成功')
class Myclass():
    pass
print(Myclass,type(Myclass))
<class '__main__.Myclass'> <class 'type'>

类的实例化

class Myclass(object):
    pass
  • class后面紧接着是类名,即Myclass,类名通常是大写开头的单词
  • 紧接着是(object),表示该类是从哪个类继承下来的,
  • 继承的概念我们在后续更新的博客再讲,通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类。

定义好了Myclass类,就可以根据Myclass类创建出Myclass的实例,创建实例是通过类名+()实现的

class Myclass():
    pass
mc = Myclass()
mc.name = '秃头程序猿'
print(mc,type(mc))
print(mc.name)
<__main__.myclass object at 0x7f4afb5248b0> <class '__main__.myclass'>
秃头程序猿

isinstance

isinstace用来检查一个对象是否是一个类的实例,返回值是布尔类型

class Myclass():
	#类的属性
    name = '程序员'
    #类的方法
    def world(a):
        print('调用方法成功')
mc = Myclass()
mc2 = Myclass()
mc3 = Myclass()
print(isinstance(mc,Myclass))
print(isinstance(mc,int))
True
False

类的调用方法

  • 调⽤⽅法 对象.⽅法名()
  • ⽅便调⽤和函数调⽤的区别:如果是函数调⽤,调⽤时有⼏个形参,就会传 递⼏个实参。如果是⽅法调⽤,默认传递⼀个参数,所以⽅法中⾄少得有⼀ 个形参

像以下实例,类中的方法中没有设立形参。将类实例化之后调用方法则会报错

class Myclass():
	#类的属性
    name = '程序员'
    #类的方法
    def world():
        print('调用方法成功')
mc = Myclass()
mc.world()
TypeError: world() takes 0 positional arguments but 1 was given

而在类的方法中随便设立一个形参之后,则调用成功

class Myclass():
    name = '程序猿'
    def world(a):
        print('调用方法成功')
mc = Myclass()
mc.world()
调用方法成功
  • 在类代码块中,我们可以定义变量和函数
  • 变量会成为该类实例的公共属性,所有的该实例都可以通过 对象.属性名 的形式访问
  • 函数会成为该类实例的公共⽅法,所有该类实例都可以通过 对象.⽅法名 的形式访问
class Myclass():
	#类的属性
    name = '程序员'
    #类的方法
    def world(a):
        print('调用方法成功')
mc = Myclass()
mc2 = Myclass()
mc3 = Myclass()
mc.world()
mc2.world()
mc3.world()
调用方法成功
调用方法成功
调用方法成功

类的属性

  • 属性和⽅法的查找流程 当我们调⽤⼀个对象的属性时,解析器会现在当前的对象中寻找是否还有 该属性
  • 如果有,则直接返回当前的对象的属性值。
  • 如果没有,则去当前 对象的类对象中去寻找,如果有则返回类对象的属性值。如果没有就报错
class Myclass():
	#类的属性
    name = '程序员'
    #类的方法
    def world(a):
        print('调用方法成功')
mc = Myclass()
mc2 = Myclass()
mc3 = Myclass()
mc.name = '搬砖工'
print(mc.name) #直接返回当前对象返回值
print(mc2.name)  #当前对象中的类对象中找
print(mc3.name)  #当前对象中的类对象中找
搬砖工
程序员
程序员

没有则报错

class Myclass():
    #类的方法
    def world(a):
        print('调用方法成功')
mc = Myclass()

print(mc.name)
AttributeError: 'Myclass' object has no attribute 'name'
  • 如果这个属性(⽅法)是所以的实例共享的,则应该将其保存到类对象中
  • 如果这个属性(⽅法)是某个实例独有的。则应该保存到实例对象中
  • ⼀般情况下,属性保存到实例对象中 ⽽⽅法需要保存到类对象中

self参数

self参数

  • 在定义实例方法时,第一个参数必须是self参数,实例在调用方法时,不需要传递参数
  • 在实例方法中需要调用类属性或其他实例方法时,必须采用self.属性名和self.方法名这两种方式

self在英文中,是’自己’的意思,在python中,self是’实例本身’的意思

  • self在定义时需要定义,但是在调⽤时会⾃动传⼊。
  • self的名字并不是规定死的,但是最好还是按照约定是⽤self
  • self总是指调⽤时的类的实例
class Myclass():
    name='程序猿'
    def print_name(self):
        print('我的职业是'+self.name)
      
mc1 = Myclass()
mc2 = Myclass()
mc1.name = '搬砖工'
mc1.print_name()
mc2.print_name()
我的职业是搬砖工
我的职业是程序猿

本文地址:https://blog.csdn.net/xdc1812547560/article/details/107625714