曲水的博客

曲水的博客

Python中的类与对象

363
2022-03-09

之前Python类这一块有点薄弱,导致每次写起代码的时候都用的云里雾里的,趁有空赶紧补一下相关的知识(

两大编程思想

面向过程

  • 面向过程解决的问题比较简单,可以用线性的思维去解决。

  • 例如:如果要做菜(西红柿炒鸡蛋)。然后要按照:准备西红柿、鸡蛋——切西红柿、打鸡蛋——开火热油——炒鸡蛋——炒西红柿——一起装盘上菜。

  • 如此的解决事情的方式是一个线性的思维方式,必须按照一定的顺序去解决该问题。

面向对象

  • 面向对象解决的问题比较复杂,使用简单的线性思维无法解决。

  • 例如:还是要吃西红柿炒鸡蛋。可以直接打开手机饿了么/美团,直接下单西红柿炒鸡蛋。至于商家如何做这件事,交给商家去处理,我们无须操心。

  • 如此解决事情的方式是直接找这个事件的参与者,从宏观上把握事件之间的联系。

两种思想的联系

  • 两者是相辅相成的,并不是相互对立的。解决复杂的问题,通过面向对象的方式有利于我们从宏观上把握事务之间复杂的关系,方便我们分析整个系统。但是在具体到微观的操作上,仍然需要使用面向过程的方式进行处理。

类和对象

什么是类

  • 类可以直接理解为分门别类,就是多个类似事物组成的群体的统称,能够帮助我们快速理解和判断事物的性质。

  • 例如:人类,鸟类,手机,电脑等。

数据类型

  • 数据类型就是一种特殊的类。例如:intstring 等等都是数据类型,不同的数据类型属于不同的类。
print(type(100))    <class 'int'>
print(type(99))     <class 'int'>

对象

  • 像 100、99 都是 int 类下包含的相似的不同的个例,这样子的个例在Python的专业术语中就叫做实例或者对象。

  • Python中一切皆对象: 在Python中创建的任何东西都是对象,例如:类对象、字典对象、列表对象等等。

类和对象的创建

类的创建

  • 创建类的语法:
class Student:     # class+类名
	pass
  • 类的组成:

    • 类属性:是独立于类的实例以外的属性,通过直接调用类得到。

    • 实例属性:是该类的实例的属性,在创建实例的时候需要传入实例属性的参数。一般用 def __init__(self) 来定义。

    • 实例方法:传入参数为该类的实例的函数,实例可以直接调用。一般用 def fuction_name(self) 来定义。

    • 静态方法:没有传入参数的该类的函数,通过类来调用。在定义前需要加上 @staticmethod注释,一般用 def fuction_name() 来定义,注意没有传入参数

    • 类方法:传入参数为类的函数,通过类来调用。在定义前需要加上classmethos注释,一般用 def fuction_name(cls) 来定义。

  • 创建类的样例:

class Student:
	# 类属性
	native_place = '广东' 

	# 实例属性
	def __init__(self,name,age):
		self.name = name	# 将获取到的name参数传给self.name作为类的实例属性
		self.age = age		# 将获取到的age参数传给self.age作为类的实例属性
	
	# 实例方法
	def info(self):		# 传入的参数为self
		print('我的名字叫:',self_name,',年龄是:',self_age)

	# 类方法
	@classmethod
	def cm(cls):		# 传入的参数为cls
		print('类方法')

	# 静态方法
	@staticmethod
	def sm():		# 传入的参数为空
		print('静态方法')
  • 创建类的注意事项:

    • 类名定义的规范:每个单词的首字母大写,其余字母小写。

    • 函数如果定义在类之外就称作函数,函数定义在类之内称作方法。

对象的创建

  • 对象的创建又称作类的实例化,有了实例,就可以调用类中的方法。

  • 创建语法:实例名=类名()

  • 以上面创建的 Student 类为例,如果需要创建一个实例,可以通过:

stu = Student('张三',20)		# 创建实例,创建的时候需要传入参数
print(stu.name)			# 实例属性,输出'张三'
print(stu.age)			# 实例属性,输入20
stu.info()			# 调用实例方法,输出为'我的名字叫张三,年龄是20'
Student.info(stu)		# 另一种调用实例方法
  • 调用实例方法有两种途径,一是 对象名.方法名() ,二是 类名.方法名(类的对象)

  • 实例对象除了保存实例的参数以外,还会保存一个类指针,指向定义的类。

类属性、类方法、静态方法

类属性的使用方式

  • 调用类属性直接用 类名.属性名 即可,也可以用 实例名.属性名。例如:
print(Student.native_place)	# 输出'广东'
stu1 = Student('张三',20)	# 创建实例stu1
stu2 = Student('李四',30)	# 创建实例stu2
print(stu1.native_place)	# 输出'广东'
print(stu2.natice_place)	# 输出'广东'
  • 类属性相当于类里面不同实例的共同属性,在该类下创建不同实例的类属性都相同。

  • 类属性支持动态修改,并不是定义好以后就不能改变了,修改方法如下。

Student.native_place = '天津'
print(stu1.native_place)	# 输出为天津
print(stu2.native_place)	# 输出为天津

类方法的使用方式

  • 类方法是使用 @classmethod 修饰的方法,可以通过使用类名直接访问,例如:
Student.cm()	# 调用类方法,输出为'类方法'

静态方法的使用方式

  • 静态方法是使用 @staticmethod 修饰的方法,可以通过使用类名直接访问,例如:
Student.sm()	# 调用静态方法,输出为'静态方法'

动态绑定属性和方法

Python是动态语言,在创建对象以后,可以动态地绑定属性和方法。

动态属性绑定

  • 如果想要为某一个实例单独绑定新的属性,可以直接在创建实例完成以后,用 实例名.属性名=属性值 的方式为实例单独绑定新的属性,例如:
stu1 = Student('张三',20)
stu2 = Student('李四',30)

# 动态绑定属性
stu1.sex = '男'

print(stu1.name,stu1.age,stu1.sex)	# 输出 '张三' 20 '男'
print(stu2.name,stu2.age,stu2.sex)	# 会报错,因为stu2不存在sex属性

动态方法绑定

  • 如果想要为某一个实例单独绑定方法,可以直接在创建实例完成以后,用 实例名.方法名=函数名 的方式为实例单独绑定新的方法,例如:
def show():
	print('我是新函数')

# 动态绑定方法
stu1.show = show
stu1.show()		# 调用stu1的show方法,输出为'我是新函数‘
stu2.show()		# 会报错
  • 0