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类对象的使用
- 类实例化后才能应用,可以有下面的操作:
- 访问,修改,删除或增加对象变量;
- 调用和添加类对象的方法。
访问变量的语法:
类对象名.变量名
调用方法的语法:
对象名.方法名(参数)
对象名和变量名或方法名之间用.
连接
动态添加/删除变量
# 为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 参数绑定值了,与普通方法一样。