第十四章:面向对象 - 类的简介

01 - 面向对象 - 面向对象举例

所谓面向对象的编程语言,简单理解就是语言中所有的操作都是 通过对象来完成的

面向过程就是将程序的逻辑分解成一个一个的步骤
通过对每个步骤的抽象来完成程序

‘’’
孩子吃西瓜
1.妈妈穿衣服穿鞋出门
2.妈妈骑电动车
3.妈妈到超市门口放好电动车
4.妈妈买西瓜
5.妈妈结账
6.妈妈骑电动车回家
7.到家孩子吃西瓜

‘’’

这种方式编写的代码往往只适用于一个功能

妈妈给孩子买西瓜

面向对象的编程思维,将所有的功能统一保存到对象当中
比如妈妈的功能就保存到妈妈的这个对象当中,孩子的功能就保存到孩子的对象当中
你要使用某个功能,直接找到对应的对应的对象即可

这种方式编写的代码,比较容易阅读,并且比较维护,容易复用

02 - 面向对象 - 类的简介

1.目前我们所学习的一些对象例如(int,str,list,tuple,dict…)这些都是Python的内置对象

类, 简单理解就是相当于一个图纸,在程序中我没玩你要跟根据类来创建对象
类就是对象的图纸,我们也称对象是类的实例(instance)
如果多个对象是通过一个类创建的,我们称这些对象都是一类对象

像 int() float() bool() list()…这些都是类

a = 10

a = int(10) # 创建一个int类的实例 等价于 a = 10
b = str(‘hello’) # 创建一个str的实例

如果我们要自定义类使用大写字母开头 MyClass 谷歌 火狐 360
规矩 规则

print(a,type(a)) # 10 <class ‘int’>
print(b,type(b)) # hello <class ‘str’>

2.定义一个类

使用关键字class来定义
语法 class 类名([父类]):
代码块

class MyClass():
    pass

print(MyClass)    # <class '__main__.MyClass'>

mc = MyClass()         # mc 就是通过MyClass创建的对象,mc是MyClass的实例

print(mc,type(mc))     # <__main__.MyClass object at 0x0000021E848F62E8> <class '__main__.MyClass'>

3. isinstance() 用来检测一个对象是否是一个类的实例

class MyClass():
    pass

mc_1 = MyClass()
mc_2 = MyClass()
mc_3 = MyClass()
mc_4 = MyClass()

# isinstance()  用来检测一个对象是否是一个类的实例
result = isinstance(mc,MyClass)      #  result = isinstance(int,MyClass)  
print(result)                                       # print(result)
>>>                                                   >>>
True                                                 False

03 - 面向对象 - 对象的创建流程

类也是一个对象!!!
类就是一个用来创造 对象的对象

class MyClass():
    pass

mc = MyClass()

mc_1 = MyClass()
mc_2 = MyClass()
mc_3 = MyClass()
mc_4 = MyClass()

# isinstance()  用来检测一个对象是否是一个类的实例
result = isinstance(mc,MyClass)
print(id(MyClass),type(MyClass))     # 2105409013784 <class 'type'>

类是type类型的对象 定义类实际上就是定义了一个type类型的对象

a = 6
print(type(a))       # <class 'int'>

格式:
class MyClass():
pass

mc = MyClass()

1.创建了一个变量mc
2.在内存中就创建了一个新的对象

现在我们通过MyClass这个类创建的对象都是一个空的对象
也就是对象中实际上什么都没有,就是相当于 一个空的盒子

我们可以向对象中添加变量 对象中的变量称之为属性
语法 对象.属性名 = 属性值

mc.name = ‘葫芦娃’
mc_2.name = ‘钢铁侠’
print(mc_2.name) # 钢铁侠

使用类创建对象的流程:
创建一个变量mc
在内存中创建一个新的对象

04. 类的定义

类的定义:类和对象都对现实生活中内容的抽象

实际上所有的失误都是有两部分组成
1.数据(属性)
2.行为(方法)

尝试定义一个人类

class person():

    # 在类的代码块中,我们可以定义变量和函数
    # 在类中我们所定义的变量,将会成为所有实例的公共属性
    # 所有实例都可以放访问这些变量
    # a = 10
    # b = 20
    name = 'hlw'
    # 在类中也可以定义函数,类中定义的函数,我们称之为方法
    # 这些方法也可以通过该类的实例来访问
    def say_hello(a):
        print('你好')
    # pass

# 创建person的实例
p1 = person()
p2 = person()

# print(p1.a,p2.b)
# print(p1.name)
# print(p2.name)

# print(p1.name)
# 调用语法 对象.方法名
# 方法调用和函数调用的区别
# 如果是函数调用,函数有几个形参,则调用函数的时候就要传递几个实参
# 但是如果是方法调用,默认传递一个参数,所有方法中至少要定义一个形参
# 注意:方法调用时,第一个参数有解释器自动传递,所以定义方法时,至少要定义一个形参
p1.say_hello()
# 加括号是调用某某,不加括号就只是个对象

程序1:

class person():
	a = 10
	b = 20
	name = 'hlw'
	
	pass

p1 = person()
p2 = person()

print(p1.a,p2.b)
print(p1.name)
print(p2.name)
>>>
10 20
hlw
hlw

程序二:

class person():
    name = 'hlw'
    def say_hello(b):
        print('你好')

b = person()

b.say_hello()

05. 面向对象 - 属性和方法

实例为什么能访问到类中的属性和方法呢?
类中定义的属性和方法都是公共的,任何该类的实例都可以访问

属性和方法的查找流程

当我们调用一个对象的属性时,解析器会先在当前对象中寻找是否含有该属性
如果有,则直接返回当前对象的属性值
如果没有,则去当前对象的类对象中去寻找,如果有则返回类对象的属性值
如果没有则报错

class person():
    name = 'hlw'

p1 = person()
p2 = person()

# 修改p1的name属性值
p1.name = 'gtx'
print(p1.name)

类对象和实例对象都可以保存属性(方法)

如果这个属性(方法)是所有实例共享的,则应该将其保存到类对象中
如果这个属性(方法)是某个实例独有的,则应该保存到实例对象中

在类中方法不能访问类中的属性

class person():
    name = 'hlw'

    def say_hello(self):
        # 第一个参数就是调用方法的本身
        # 如果是p1调用,则第一个参数就是p1对象
        # 如果是p2调用,则第一个参数就是p2对象
        print('你好!我是%s'%self.name)

p1 = person()
p2 = person()

p1.name = '葫芦娃'
p2.name = '钢铁侠'

p1.say_hello()    # 你好, 我是葫芦娃
p2.say_hello()    # 你好, 我是钢铁侠

>>>
你好!我是葫芦娃
你好!我是钢铁侠
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章