目录
前言:
面向过程和面向对象
类和对象
Python中类的定义
(1)类的定义形式
(2)深层剖析类对象
前言:
感谢各位的一路陪伴,我学习Python也有一个月了,在这一个月里我收获满满,学到了很多知识,每当我学会了一个新的知识点我会发表一篇博客来表达自己想法和见解,我也写了一篇Python基础学习的专栏(https://blog.csdn.net/m0_73633088/category_12186491.html) 这一阶段的学习也基本告一段落了,而今天我将会开始学习Python中的高级语法,开启Python进阶的新征程,路途漫漫,道路艰险,而我一往无前。
面向过程和面向对象
编程语言一般分为两种编程范式,一种是面向过程,另一种是面向对象,这两种范式是不相同的语言方法,侧重点是完全不相同的。
面向过程:在前面我们学习的Python基础语法以及C语言,这些都是面向过程的语法,其核心在于过程二字,过程指的是解决问题的步骤,编程的时候先把解决问题的步骤分析出来,然后用函数把这些步骤实现,在一步一步的具体步骤中再按照顺序调用函数,适合简单任务,不需要过多协作。
面向对象:核心就是对象二字, 对象是有属性和方法组成的,编程的时候首先思考的怎么设计这个事物,比如思考造车,我们会思考车怎么设计?,而不是“怎么按照步骤造车的问题”,找轮胎厂制造轮胎,发动机厂制造发动机,发现同时造车的步骤,组成在一起,就完成造车,大大提高了效率。而面向对象即是Python语言的精髓所在。
那这里就有人会问了:这两种编程范式肯定有高低之分的吧,应该是面向对象比面向过程更加高级。注意力!!!编程范式是没有高低之分的,就好比如文化这一方面,为什么总是有些人崇洋媚外呢?难道中华文化就低人一等了?中国汉服不好看吗?为什么非要去穿和服呢?拜托,中华文化可是有5000年的历史啊,源远流长,博大精深,足以傲视全世界!这里是就是想说明一下编程范式跟文化是一样的实际上没有什么高低之分,只是在不同情况下的适应性不同,千万不要有什么偏见。
类和对象
类:这里就说到类了,好,那什么是类?其实很简单理解,比如说一个物种,或者说某一类人,顾名思义‘类’是表示某一种事物具有某一共同特征,这就能被分为一类
对象:对象是表示这个类的例子,是具体的实例(具体存在的)
给个例子吧:比如说狗这一类可以分为好多个品种,就以哈士奇和金毛为对象,哈士奇具有什么属性呢?这都不用我说了,二哈名字都摆在那呢;金毛又有什么属性呢?亲人嘛,性格温顺,体贴他人,这些都是这两个对象特有的属性,而它们共有的属性就是:会狗叫、会做坏事、会摇尾巴……等等。很好理解吧!!!
Python中类的定义
前面我们学过字符串的类别是str,整形的类是int、浮点型的类是float……等等,这些都是Python中定义好了的类,我们可以通过这些类去调用类里面的属性和方法,那这里我来教你们怎么去定义类,以及怎么去理解类
(1)类的定义形式
前面我们学过了函数的定义就是def + 函数名字: 下面就是函数体了,其实类也是相似的用关键字class来定义:
#函数的定义
def 函数名(形参):
函数体
函数名(实参)
#类的定义
class 类名:
类代码(属性,方法)
类的相关规则:
类名的定义:使用大驼峰命名,(所有单词首字母大写)
定义类之后没有实例对象:执行代码,类中代码执行
定义在类中的变量称为属性,函数称为方
示例1:定义和修改类属性
class Dog:
name='dog' #在类中的变量是属性(attribute)
age=5
erha=Dog() #建立实例化对象
print(type(erha))
#输出结果:dog 5
# <class '__main__.Dog'>
说明:这里是创建了一个Dog类型,其中有两个属性,name和age,这两个类属性是实例化对象共同拥有的属性,下面我们建立了一个实质化对象erha=Dog() 然后我们就可以输出这个实质化对象的属性,其类型就是Dog 类型,这里还是很好理解的
class Dog:
name='dog' #在类中的变量是属性(attribute)
age=5
erha=Dog()
print(erha.name,erha.age)
erha.age=3
erha.name='gou'
print(erha.name,erha.age)
#输出结果:
# dog 5
# gou 3
实例化对象的类属性是可以去修改的,直接赋值修改就OK了
示例2:定义实例方法
1.写法1
class Dog:
name='dog'
age=5
def fun(self):
print('这是一直可爱的小狗')
erha=Dog()
print(erha.fun())
#输出结果:这是一直可爱的小狗
2.写法2:,通过类名.方法(实例对象) ---表达
#写法:
class Dog:
name='dog'
age=5
def fun(self):
print('这只小狗真可爱')
erha=Dog()
print(Dog.fun(erha)) #我们可以直接把实例参数传入到self
#输出结果:这只小狗真可爱
3. 添加位置参数
class Dog:
name='dog'
age=5
def fun(self,name): #定义参数name
print(f'这是一直可爱的小狗{name}')
erha=Dog()
print(Dog.fun(erha,'happy'))
#输出结果:这是一直可爱的小狗happy
注意:
这里定义了一个实例方法为fun,那这里有人就会问,这个不就是函数吗?不是的,在Python中定义在类里面的不叫做函数,而是叫做方法,而定义在类以外的才叫做函数,这里要区分开来。
说明:
这是一个实例方法,在创建的过程中会自动创建一个self参数,这个参数是表示实例对象的本身,当我们创建好了一个对象之后可以去调用这个方法,以上就是这个方法调用的三种写法
示例3:init初始化方法
init初始化方法又叫做实例化方法,魔法方法,构造方法
该方法在初始化(实例)对象时会自动调用,通常情况用于初始化对象的属性
该方式在实例化对象时会自动调用,不需要手动调用
class Dog:
animal='dog'
def __init__(self,name,age): #name和age是表示实例对象的初始化属性,也是特定属性
self.name=name #这里的self.name是自己定义的,而后面的name是参数
self.age=age
def fun(self):
print('这只小狗真可爱')
if __name__=='__main__':
erha=Dog('Timi',5) #里面的参数必填,否则会报错
print(erha.animal,erha.name,erha.age)
print(erha.__dict__) #查看实例对象erha 的特定属性
#输出结果:dog Timi 5
# {'name': 'Timi', 'age': 5}
init 初始化方法是定义并且初始化实例对象的特点属性,我们可以去通过__dict__去查看,然后返回实例对象属性的键值对。
(2)深层剖析类对象
class Dog:
name='dog'
age=5
print(Dog)
erha=Dog()
print(id(erha))#输出获取地址
#输出结果:<class '__main__.Dog'>
# 2931955054960
这里我们可以看出当我们去调用的时候就要加上() ,这个跟函数是一样的,如果不去调用就会跟第一个输出结果一样,输出这个类的类型,例如:print(int) 这个的输出结果就是<class 'int'>,当我们去调用了这个类之后其实就是已经创建了一个实质化对象,这时候计算机会开辟一段内存空间,从id() 函数获取的地址就可以看出
再看一个例子:
class Dog:
name='dog'
age=5
erha=Dog()
print(id(int))
print(id(Dog))
print(id(erha))
#输出结果:140735865654544
# 2504339459136
# 2505947003248
这里我们可以看出,其实类本身就是有一个空间地址的,而我们去创建一个实例化对象实际上是创建了一个类指针,这个对象erha的类指针指向了Dog 类型,我们可以去通过这个类指针来访问Dog 类型的属性和方法,这也说明了,如果我去定义多个实例对象的话,那么这些实例对象的类指针都会指向定义的类Dog,所以,一个类是具有公用功能的。
class Dog:
animal='dog'
def __init__(self,name,age):
self.name=name
self.age=age
def fun(self,name):
print(f'这只{name}真可爱')
def recurrence(self,age):
i=1
sum=1
while i<=age:
sum*=i
i+=1
return sum
if __name__=='__main__':
erha=Dog('哈士奇',5)
Dog.fun(erha,erha.name)
print(Dog.recurrence(erha,erha.age))
jinmao=Dog('金毛',4)
Dog.fun(jinmao,jinmao.name)
print(Dog.recurrence(jinmao,jinmao.age))
#输出结果:这只哈士奇真可爱
# 120
# 这只金毛真可爱
# 24
这里可以看出我建立了两个实例对象,其中的方法都是共享的,也就说明类指针的强大所在。
好了,这一期就到这里了,谢谢各位~~~
日常分享壁纸~