python是一种面对对象编程的语言,其有很多的优点,使用类的编程方法也是python的一种特色。很多没有接触过类的人都会觉得类的使用比较复杂,同时类的继承是非常重要的功能,所以由于工作中可能用不太上继承,所以就忽略了类的使用。但是实际上使用类进行编程能够使代码更加清晰明了,同时也易于重用。
由于类的内容较多,因此我准备分几次写啦!
附上类使用专栏的其它文章的链接:
- python 类的使用(1) 之类使用的基本框架
- python 类的使用(2) 之类变量
- python 类的使用(3)之类中常用的三个装饰器@classmethod、@staticmethod、@property
- python 类的使用(4)之类常用的魔法方法
- python 类的使用(5)之类装饰器(类的装饰器和类作为装饰器)
- python 类的使用(6)之类的继承
- python 类的使用(7)之类的私有属性和方法 (类中以单下划线或双下划线开头的变量名或函数名)
类的基本框架
类,正如其名,其被用来当做是一个种类,这个种类是具有一定的属性和一定的方法的。属性是类中所包含的变量,方法也就是类中所定义的各种函数,这里要注意类中所定义的变量是不包含在类方法中的,要不然就不叫类变量了。
类代表一个类,那么类的一个确切的例子也就是类实例了。类和类实例的区别就像是人类和一个人的区别,类都具有属性,就好比人类都具有手脚、大脑等等,类的方法就好比人类都能够吃饭、工作、学习等,而一个人就是类的实例化,一个人比如说我,我有属性(手脚、大脑),我还有方法(能够吃饭,工作)。这里应该能理解了吧,实际上类实例就是对类中属性、方法的一种实例化,使用一个例子去套用类中的属性和方法,而这个例子和这些属性和方法都是契合的。
接下来一下类使用的一个最简单的例子吧:
class Worker:
sex = 'male' # 类变量(也即类属性),在函数外设置,除非外部重新设置否则不变化
def __init__(self, name, age):
self.name = name
self.age = age
self.email = name + str(age) + '.email.com'
'''
init是类的初始化函数,一个类在被调用时首先就要进入到init中来,通过init使类实例传入的参数
等都被一一分配,也就是init能够将变量交给self储存。因此总的来说self所携带的属性可以从类属性
中来(如此例中的sex),也可以是在init初始函数中被定义。但是这些属性只要有被定义过就能够被访问
到。在这个例子中我们在init方法中通过函数获取的name和age设置了self.name、self.age和
self.email的变量,这些变量就被self这个实例对象储存下来。也就是说self将一个类中的方法或
属性可能会用到的变量全部都储存起来了实际上可以把self对象携带的东西当成一个字典,就像
{self.name:name,self.age:age,self.email:name + age + '.email.com'}这样
实际上每个类实例在类看来都是一个self,而每一个self都有一个自己的字典。类中定义的方法想要
使用类实例携带的变量只要在函数定义时加入self作为函数参数即可,self携带的变量和属性就
都可以被类中定义的方法访问啦!实际上self携带的变量也可以使用其它命名,如self.n = name也
可以,但是要调用的时候就是使用self.n了所以一般情况下大家都会用其原始命名,避免混乱也比较方便
'''
def printit(self):
print('{0} is {1} years old and is {2}'.format(self.name,self.age,self.sex))
# 这里这个函数我传入了self,因此通过self.name、self.age、self.sex等可以获取到类变量和传入的实例变量
A = Worker('Mark',10)
'''
这里是将类实例化的过程,正是因为使用了__init__方法,因此类会自动识别这些变量
并按照定义的__init__方法去读取传入的变量,实际上想要自己写初始方法也可以,但是就更麻烦一点,
可以参考:https://blog.csdn.net/xrinosvip/article/details/89647884
'''
print(A.sex)
# A已经是一个实例化的类对象了,其具有属性,并且具有方法,可以获取其属性,或者执行其中的方法。
A.printit()
# 此处为执行类中的函数,执行的函数获取的变量来自于self
'''
上面代码执行结果为:
male
Mark is 10 years old and is male
'''
上面就是一个类的基础框架啦,刚刚接触类的使用可能会感觉有点蒙圈,因此上面解释的较多,希望能帮助到读者理解吧。其实可能比较难理解的地方就是self了,其实self就是代表一个类实例所拥有的所有变量和属性嘛,只要有传入self,那么self就帮着储存以及传递属性,变量,这样在类中的所有有传入self的方法就能很方便地访问到类实例的变量和属性啦。
另外类还可以储存外界传入的属性直到一个类实例使用结束,例如:
# 还是刚刚的例子
class Worker:
sex = 'male'
def __init__(self, name, age):
self.name = name
self.age = age
self.email = name + str(age) + '.email.com'
def printit(self):
print('{0} is {1} years old and is {2}'.format(self.name, self.age, self.sex))
A = Worker('Mark', 10)
print(A.sex) # 第一个print
print(A.email) # 第二个print
# 此处获取类中的类属性,并打印
A.sex ='female' # 尝试将类属性修改
A.name = 'lily' # 尝试将类实例传入的类变量也修改
A.height = 1.82 # 尝试加入新的类属性
print(A.sex,A.height) # 第三个print
print(A.email) # 第四个print
A.printit() # 调用类中的函数 第五个print
del A
print(A.sex) # 在类删除后再尝试获取类属性 第六个print
运行结果如下:
一行一行分析结果:
- 第一行:由第一个print函数打印出,这时候的性别属性还未被修改,因此这时候打印出的性别还是male
- 第二行:由第二个print打印出,此时email还是最开始的email,因为姓名未修改
- 第三行:第三个print函数打印,其中包含了性别、身高(height)、以及email,可以看出性别和身高都如我们所愿修改了,也就代表类属性是能够被修改的,同时类属性也是可以再额外添加的。
- 第四行:可以看到这里的email地址未随着姓名的改变而改变,这是为啥呢?其实想想就知道,最开始在使用这个类的时候(也就是创建类实例时),这个类已经经过了init方法的初始化,self已经储存了各种变量的值,这里传入的姓名只能够改变self.name,但是不能改变self.emal了。但是实际上也是有办法能改变的,哈哈 就是使用@property装饰器,后面的文章我应该会解释这个的。
- 第五行:其实就是类的方法中使用到的类属性和类变量也随着改变了。
- 最后报错是因为A这个类实例已经被删除啦!
在上面这些基础框架搭好之后,可以使用help及dict等方法查看一些帮助信息,方法如下:
# 还是上面的代码
class Worker:
sex = 'male'
def __init__(self, name, age):
self.name = name
self.age = age
self.email = name + str(age) + '.email.com'
def printit(self):
'''
打印一些帮助信息
'''
print('{0} is {1} years old and is {2}'.format(
self.name, self.age, self.sex))
A = Worker('Mark', 10)
# 此处获取类中的类属性,并打印
A.sex = 'female' # 尝试将类属性修改
A.name = 'lily' # 尝试将类实例传入的类变量也修改
A.height = 1.82 # 尝试加入新的类属性
print(A.__dict__)
print(help(A))
结果如下:
可以看到第一行是这个类所具有的各种类属性及变量,这些都是可以被获取及使用的。
接下来的是帮助文档,大概是一个类的框架,自己熟悉了之后可以写一些自己代码的帮助文档(就是写注释就行啦,但是要用三个引号引起来的那种哦),以后看起来也方便。
叮
类是一种很好用的方法,不仅仅可以用于一些继承的情况。使用类可以让代码更加简洁,也比较容易构建,重用等。不要犹豫啦,偶尔试一试呗!
后面还会更新类使用的知识,会做成一个小的系列,希望大家喜欢!!!
参考:https://www.py.cn/course/1106.html
参考:https://blog.youkuaiyun.com/xrinosvip/article/details/89647884