一、类的用法
1.1 类的构造
类即类别、种类,是面向对象设计最重要的概念,对象是特征和技能的结合体,而类是一系列对象相似的特征与技能的结合体。
在程序中,务必保证先定义类,后产生对象。
类和函数的使用是类似的,先定义函数,后调用函数,类也一样。在程序中先定义类,后调用类。不一样的是,调用函数会执行函数体代码返回的是函数执行的结果,而调用类会产生对象,返回的是对象。
定义类,使用关键字class + 空格 + 类名,类名用大驼峰命名,变量名推荐使用“_”这种方式就是为了区分。
class DeepshareStudent:
# 用变量名表示特征
school = 'deepshare'
# 用函数表示技能
def learn(self):
"""
self是使用pycharm自动添加的,写成xxx也是一样的,就是一个位置参数,必须被传值。
"""
print('is learning')
print('=====>')
- 类是特征与技能的结合体,所以类中最常见的就是变量和函数,但是类中也可以有任意的python代码;
- 执行以上代码,会发现会打印一行箭头,这就说明这段代码运行了,这说明在定义类的阶段会立刻执行类体内的代码;
- 既然执行了代码,有变量有函数,那就会将产生的名字存放于类的名称空间;
1.2 类的查看
使用类型.__dict__方法可以查看类的函数和变量;
name_and_func = DeepshareStudent.__dict__
print(name_and_func)
# 输出
"""
{
'__module__': '__main__',
'school': 'deepshare',
'learn': <function DeepShare.learn at 0x000002764C2F1D08>,
'__dict__': <attribute '__dict__' of 'DeepShare' objects>,
'__weakref__': <attribute '__weakref__' of 'DeepShare' objects>,
'__doc__': None}
"""
注意这是一个字典的格式,因为有名字有内存地址,这是一一对应的关系,最合适使用字典存储;
print(name_and_func['school'])
print(name_and_func['learn'])
# 执行代码输出
"""
deepshare
<function DeepShare.learn at 0x000002764C2F1D08>
可以看到name_and_func['learn']是一个函数的内存地址,那么加(0应该就能调用
"""
#执行以下代码
name_and_func['learn']()
# 结果报错了,错误类型说learn()这个函数少了一个位置参数‘self’,在learn函数中,位置参数self必须被传值。代码可以改为
name_and_func['learn']('albert')
在类的函数中,self指的是类的对象本身。
每次想拿到类的函数或者变量的时候可以使用上面的方法,但是这样很麻烦,可以使用下面的方法:
DeepshareStudent.school
DeepshareStudent.learn
1.3类的修改
# 修改类的属性值
DeepshareStudent.school = 'zzz'
# 给类添加属性
DeepshareStudent.country = 'china'
# 删除类的属性
del DeepshareStudent.country
二、对象的用法
面向对象的核心是对象,当把类造出来,类相当于一个模板或者是工厂,接下来需要使用类批量生产对象。
定义类
class DeepshareStudent:
school = 'deepshare'
def learn(self):
print('is learning')
调用类的方式和调用函数一样,类后面加括号;
DeepshareStudent()
# 执行代码没有任何结果
调用类的同时会产生对象,只需要把它赋值给对象就可以了
stu1 = DeepshareStudent()
stu2 = DeepshareStudent()
stu3 = DeepshareStudent()
每调用一次,类的模板就会加工一个对象,但是这么做加工出来的对象没有区别,每次得到的对象是一样的,但实际上我们需要的对象肯定不是完全一样的。这时候我们需要一个def init()函数。init()函数在产生对象的时候会被自动执行,从而可以给对象中的变量进行赋值。
def __init__(self,x,y,z):
self.NAME = x
self.AGE = y
self.GENDER = z
这样就实现了我们的需求,因此类可以写为:
class DeepshareStudent:
school = 'deepshare'
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
def learn(self):
print('is learning')
这样创建的类既有公共属性又有私有属性。注意self是对象本身,它是在调用类产生对象时自动传值的。写代码时pacharm会自动添加这个self,也可以写为其它变量名,例如aaa,不过意义不明确,但是不写是不行的。