python精讲之面向对象(1)

基本概念

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

  • 面向对象编程——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()
我的职业是搬砖工
我的职业是程序猿

猜你喜欢

转载自blog.csdn.net/xdc1812547560/article/details/107625714