Python创建类


python 有一个传说“一切皆对象”

面向对象编程是在面向过程编程的基础上发展来的,它比面向过程编程具有更强的灵活性和拓展性。面向对象编程是程序员发展的风水岭,很多初学者会因无法理解面向对象而放弃学习编程。

面向对象编程(Object-oritented Programming,简称OOP),更多是指封装。一个列表(数据封装),一个函数(代码封装),都是封装。

面向对象编程,也是一种封装的思想,世间万物都是对象,把描述特征的数据和代码块(函数)封装到一起。

把一个人用代码封装成对象:
表面特征(属性):例如,很胖、2个眼睛、体重120 kg等等。
所具有的行为:例如,会看电影、会说话、会睡觉等等。
面特征可以用变量来表示,行为特征可以用函数来表示:

class person:
	fat = True
	eye = 2
	weight = 120

	# 看电影
	def movie(self):
		print(“看电影”)
	
	# 说话
	def speak(self):
		print("说话")

以上代码仅是为了演示面向对象的编程思想。

因此,从某种程度上,相比较只用变量或只用函数,使用面向对象的思想可以更好地模拟现实生活中的事物。

面向对象术语

在系统学习面向对象编程之前,初学者要了解有关面向对象的一些术语。当和其他人讨论代码的时候,或者尝试查找我们遇到的问题解决方案时,知道正确的术语很有帮助。

面向对象常用术语:
类: 可以理解是一个模板,通过它可以创建出无数个具体实例。比如,前面编写的 person 表示人,通过类可以创建出无数个人(类的实例化)。
对象: 通过类创建出的实例(又称对象)才能使用,像图纸和房子的关系,通过图纸建立的房子(对象)才能使用。
属性: 类中的所有变量称为属性。例如,person这个类中,fat、eye、weight是类的属性。
方法: 类中的所有函数通常称为方法,不过,和函数有所不同的是,类方法要包含一个 self 参数才能使用。例如,person 类中,move()、eat()、sleep()都是这个类所拥有的方法,类方法无法单独使用,只能和类的对象一起使用。

Python(class)类

Python 类的使用过程:
创建类,也就是制作图纸的过程:
创建类的实例对象(根据图纸造出实际的物品),通过实例对象实现特定的功能。

先说创建类
Python类的定义

语法
class 类名:
	若干个(>=0)类属性...
	若干个(>=0)类方法...
参数

类属性还是类方法,可有可无,没有强制要求,他们的位置是任意的。
和变量名一样,类名是一个标识符,但我们必须还要考虑程序的可读性,类名后跟冒号(:)

类属性: 指的就是包含在类中的变量;
类方法: 指的就是包含类中的函数。同属一个类的所有类属性和类方法,要保持统一的缩进格式,通常统一缩进4个空格。

class Demo:
	'''这是一个学习Python定义的第一个类'''
	# 类属性
	url = 'https:://www.banyeshu.com'
	# 类方法
	def good(self, content):
		print(content)

可以为类定义说明文档,其要放到类头之后或类体之前的位置,如上面程序中第二行的字符串,就是 Demo 这个类的说明文档。

say() 是一个实例方法,除此之外,Python 类中还可以定义类的方法和静态方法。

Python 允许创建空类,没有任何类属性和类方法的类:

class Empty:
	pass

如果一个类没有任何类属性和类方法,那么可以直接使用 pass 关键字作为类体即可。但在实际应用中,很少创建空类,因为空类没有任何实际意义。

Python__init__()类构造方法

_init_()方法,该方法是一个特殊的类实例方法,称为构造方法(或构造函数)。创建一个类的实例对象时,Python解释器都会自动调用它。

语法
def __init__(self, ...):
	代码块

__init__在开头和结尾都有2个下划线,且中间不能有空格。Python 有很多这种格式的方法,它们都具有特殊的意义。

_init_()方法可以包含多个参数,但第一个必须是self的参数:

class Demo:
	'''这是一个学习Python定义的第一个类'''
	# 构造方法
	def __init__(self):
		print("构造方法被调用")
	
	# 类属性
	url = 'https://www.banyeshu.com'

	# 类方法
	def good(self, content):
		print(content)

test = Demo()	# 实例化Demo

运行结果:
构造方法被调用

实例化Demo类时,隐式调用__init__()构造方法。
如果我们没有添加构造方法,Python也会自动为类添加一个构造方法(只有self参数)。

例子(init)多参数
class DemoParams:
	'''这是一个测试类'''
	def __init__(self, name, str):
		print(name, "的网址:", str)

# 实例化DemoParams时,传递参数给构造函数

my_app = DemoParams("半页书", "https://www.banyeshu.com")

运行结果:
半页书 的网址:https://www.banyeshu.com

当类的构造方法有多个参数,同时参数没有默认值时,实例化DemoParams时,需要传递参数给构造函数。
构造方法中有self、name、str 3个参数,但实际需要传参的仅有 name 和 add,也就是说,self 不需要手动传递参数。

Python 类对象

类的实例化: 创建类对象的过程

语法

类名(参数)

提示:如果 _init_()中仅有一个 self 参数,则构造方法可以忽略不写。

例子

class Demo:
	name = "半页书"
	str = "https://www.banyeshu.com"

	def __init__(self, name, str):
		self.name = name
		self.str = str
		print(name, "网址为:", str)

	def say(self, content):
		print(content)

banyeshu = Demo("半页书", "https://www.banyeshu.com")

构造方法除self参数外,还包含2个参数,都没有默认参数,因此在实例化类对象时,需要传入相应的 name 值和 str 值(self 参数是特殊参数,不需要手动传值,Python 会自动传给它值)。

类的使用

Python类对象的使用

  1. 类实例化后才能应用,可以有下面的操作:
  2. 访问,修改,删除或增加对象变量;
  3. 调用和添加类对象的方法。
    访问变量的语法:
    类对象名.变量名

调用方法的语法:
对象名.方法名(参数)

对象名和变量名或方法名之间用.连接

动态添加/删除变量
# 为demo对象添加一个hot实例变量

demo.hot = 'hot'

print(demo.hot)

运行结果为:
hot

使用del语句删除变量:
# 删除 hot 实例变量
del demo.hot

# 删除后获取 hot,此时会报错

运行结果,包AttributeError错误:
Traceback(most recent call last):
File"<stdin>",line1,in<module>

类对象动态添加方法

先定义一个函数

def addToObject(self, name):
	print("——添加的方法参数——", self, name)
	
# 使用addToObject 对 demo的addToObject 方法赋值(动态绑定方法)
demo.addToObject = addToObject

# Python 动态添加的方法,不会自动绑定第一个参数self,所有参数都要传值
demo.addToObject(demo, 'good')	# 第一个参数传了demo的实例
demo.say('good')	# say方法并不要为第一个参数self传值

# 使用lambad表达式为demo对象的foo方法赋值(动态绑定方法)
demo.foo = lambda self:print('——lambda表达式——',self)
demo.foo(demo)	# 绑定self

动态增加的方法,Python 没有第一个参数self的概念,所有的参数都要传值。

可以通过 types 模块下的 MethodType 可以实现,第一个参数自动绑定,仍以上面的 addToObject()函数为例:

def addToObject(self, content):
	print("半页书:%s", % content)

# 导入 MethodType

from types import MethodType

demo.addToObject = MethodType(addToObject, demo)

# 第一个参数已经绑定了,无需传入

demo.addToObject("https://www.banyeshu.com")

使用 MethodType 为 addToObject() 第一个参数self绑定为 demo,因此后续再使用 addToObject() 函数时,就不用再给 self 参数绑定值了,与普通方法一样。

  • 11
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-Harvey

感谢您的认可,无限飓风不断进步

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值