类与实例的关系

类:Class

类可以简单的认为是一个 含有各种函数(方法)、变量(属性)的模板,

L- 类与实例(对象) - 图1```python class ClassName: # 类定义

  1. def func(): # 方法(函数)
  2. print(var)
  3. return 0
  4. var = "variable" # 属性 (变量)
  1. ---
  2. <a name="3mdMy"></a>
  3. #### 实例(对象):Object
  4. >
  5. > 类只是个模板,要想使用类需要通过“声明”的方式
  6. > 用“类”去生成一个“实例”对象后才能使用
  7. >
  8. > *(类比: =汽车图纸, 实例 =汽车)
  9. > *( 例如: int 数据类型是一个类,a=10 a是一个int实例)
  10. ![](https://cdn.nlark.com/yuque/0/2021/jpeg/2485877/1611769835718-399bd0f8-1622-4020-a592-db6c3f1ea028.jpeg)```python
  11. class ClassName: # 类定义
  12. def func(): # 方法(函数)
  13. print("class function")
  14. return 0
  15. var = "variable" # 属性 (变量)
  16. obj = ClassName # 声明对象
  17. obj.func() # 使用对象obj的方法(obj.func())
  18. print(obj.var) # 使用对象obj的属性(obj.var)
  1. #=============================
  2. #ouput
  3. class function
  4. variable

类:Class

L- 类与实例(对象) - 图2

类定义:class ClassName(object):

  1. class ClassName(object): # 类定义(object是基类)
  2. def func(): # 方法(函数)
  3. print(var)
  4. return 0
  5. var = "variable" # 属性 (变量)

构造方法:init( )

用来初始化的一个方法,如果要申请新变量可以在这里面申请

注意: 1)init 的第一个参数一定是 self 2)如果类中有init方法,则在创建对象时一定要传入参数 3)如果类中有init方法,则在定义方法时第一个参数必须是self 4)如果类中有init方法,则在定义属性时必须有 空间名称self 4)如果类中有init方法,则在使用属性和方法时时必须有 空间名称self *(一定要4、5注意,否则会报错) 5)init方法不需要返回值

self: 1)self是约定名称,虽然名字可以随便写,只要每个方法的第一个参数保持一致,但按规范要写self 2)self的作用是传入当前对象的地址 3)self参数是隐藏的,即在创建对象或者调用方法时不需要传入self参数 该步骤是自动完成的。只要定义的时候要写

什么是self. 4)self和C++的this指针是类似的东西 对象可以通过对象名来使用方法和属性,但是类还没被创建出来如何使用类里的东西 self就是用来指代类自己的 3)以下面例子为例 (如果是对象,用 obj.func( )来调用自身的方法) (如果是类内部,用self.func( )来调用自身的方法)

  1. class ClassName(object):
  2. def __init__(self, var):# 定义__init__方法
  3. self.inside=var # 定义属性时有self
  4. def func(self): # 定义方法时,第一个参数为self
  5. print(self.inside) # 调用属性时,有self作为空间名称
  6. return 0
  7. def funcB(self):
  8. self.func() # 调用类内部函数
  9. obj = ClassName(2) # 因为init有参数,所以创建对象时,必须传入参数
  10. obj.func() # 调用对象内部函数
  11. #=========================================
  12. #ouput
  13. 2

**

封装

  1. class ClassName(object):
  2. def __init__(self, var):
  3. self.inside=var # 这个过程称为数据封装,即将外部传入数据封装在对象里面
  4. obj = ClassName(2)

访问控制

按照访问可以把属性方法分成3种类型 1)特殊类型:头尾各有一对下划线的属性和方法【init( )】 2)私有类型:头部有一对下划线的属性和方法【__func( )】 约定私有:头部有一个下划线的属性和方法【_func( )】 3)公共类型:正常命名的属性和方法

特点: 1)特殊类型:Python规定具有特殊用途的方法【例如init( )是用来初始化对象的】 2)私有类型:只能由类的内部函数使用的类型,外部不能够调用 约定私有:虽然可以被访问和修改,但是通常是以约定的形式表示尽量不要从外部去访问和修改有一个下划线的属性和方法【_func( )】 3)公共类型:可以同时在类里对象外使用

AttributeError: 如果尝试从外部去调用私有类型的属性和方法 会引发AttributeError

注意:请不要这样写属性或者方法 _name__word

  1. class ClassName(object):
  2. def __init__(self):
  3. print("特殊方法")
  4. self.__varInside = "私有属性"
  5. self.var = "公共属性"
  6. def _funcInside(self):
  7. print("私有方法")
  8. return None
  9. def func(self):
  10. print("公共方法")
  11. obj = ClassName() #创建实例,并自动运行__init__()方法
  12. print(obj.var) #从外部 访问共有属性
  13. obj.func() #从外部 访问共有方法
  14. obj.__funcInside()
  15. print(obj.__varInside)
  1. #输出
  2. #===============================
  3. 特殊方法
  4. 公共属性
  5. 公共方法
  6. Traceback (most recent call last):
  7. File "E:\play.py", line 19, in <module>
  8. obj.__funcInside()
  9. AttributeError: 'ClassName' object has no attribute '__funcInside'

注意:

不要在类外对私有函数进行赋值,这样做的结果是生成一个新的属性 因为私有属性的名字会被解释器改成_ClassNamename
(虽然也可以间接通过_ClassName.
name 访问,但强烈建议不要这么做)

  1. class ClassName(object):
  2. def __init__(self):
  3. self.__var = "私有属性"
  4. def func(self):
  5. print(self.__var)
  6. return None
  7. obj = ClassName()
  8. obj.func()
  9. obj.__var = "重置属性"
  10. print(obj.__var)
  11. obj.func()
  1. #输出
  2. #===============================
  3. 私有属性
  4. 重置属性
  5. 私有属性 #从这里就可以看出,私有属性并没有被修改

定制类

XXX

如果我们去查询一个类属性和方法,我们会发现里面自带了很多XXX的属性和方法 我们也可以添加一些xxx属性

注意: XXX 这些属性和方法在Python中是有特殊用途的,请不要乱用

例如: _init :初始化类 new :新建并返回实例 call :重载括号运算符 iter :返回迭代器 next :返回下一个元素 slots _ :限制类绑定

如果想知道更多可以访问Python官方文档: https://docs.python.org/3/reference/datamodel.html#special-method-names QQ截图20210206163853.png