用户登录
用户注册

分享至

python精讲之面向对象(1)

  • 作者: 地势坤唯吾独尊85761883
  • 来源: 51数据库
  • 2021-11-22

文章目录

  • 基本概念
  • 面向过程
    • 类(class)
      • 类的创建
      • 类的实例化
        • isinstance
      • 类的调用方法
      • 类的属性
      • self参数

基本概念

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

  • 面向对象编程——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()
我的职业是搬砖工
我的职业是程序猿
软件
前端设计
程序设计
Java相关