##################################################
目录
##################################################
活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰;一个人摸索学习很难坚持,想组团高效学习;想写博客但无从下手,急需写作干货注入能量;热爱写作,愿意让自己成为更好的人…
…
欢迎参与CSDN学习挑战赛,成为更好的自己,请参考活动中各位优质专栏博主的免费高质量专栏资源(这部分优质资源是活动限时免费开放喔~),按照自身的学习领域和学习进度学习并记录自己的学习过程,或者按照自己的理解发布专栏学习作品!
##################################################
——————————
在 Python 语言中 所有以双下划线 __ 包起来的方法都统称为 魔术方法
这些方法在实例化时会自动调用!
例如
__str__()
__init__()
__del__()
等等
使用魔术方法可以构造出非常优美的代码
比如
将复杂的逻辑封装成简单的 API
等!
- 魔术方法中的
- __init__()
- 一般叫做构造函数 用于初始化类的内部状态和参数
- 如果程序员不提供 会給出一个默认的 __init__()
-
- 而
- __ del __()
- 函数叫做析构函数
- 用于释放对象占用的资源
- __del__() 函数是可选的
- 如果不提供 会在后台提供默认析构函数
-
- 魔术方法中有些可以实现属性访问控制的功能
- 例如
- __getattr__(self,name)
- __setattr__(self,name,value)
- 方法等
示例魔术方法:
- >>> class A:
- ... str = "语言"
- ... def __init__ ( self, i = "中文" ):
- ... self.str = i
- ... print ( "构造函数 >>> ", self.str ) # 重写构造函数
- ... def __del__ (self):
- ... print ( "析构函数 >>> ", self.str ) # 重写析构函数
- ...
- >>> a = A() # 实例化对象 自动调用构造函数
- 构造函数 >>> 中文
- >>> b = A ( "英文" ) # 实例化对象 传参重写构造函数
- 构造函数 >>> 英文
- >>> a.__del__() # 调用析构函数
- 析构函数 >>> 中文
- >>>
对于这些魔术方法 在创建对象时可以自动执行
当对象自动执行析构函数后 对象仍然存在
但是在 del 对象后 对象就已经被回收删除 无法再次使用:
- >>> del a # 删除对象 a
- 析构函数 >>> 中文
- >>> print(a) # 报错 因为 del 后对象就不存在了
- Traceback (most recent call last):
- File "
" , line 1, in - NameError: name 'a' is not defined. Did you mean: 'A'?
- >>>
##################################################
——————————
普通方法与一般函数的定义的不同在第一个参数是 self 指代的意思是指向实例对象本身
类方法调用必须要借助对象
所以普通方法的调用方式为:
对象.方法名()
不能直接用
类名.方法名()
类中的方法第一个参数是 self 代表的是实例对象本身 因此类是不能直接调用普通方法的!!!
——————————
前面普通方法是需要
对象名.方法名()
去调用 而魔术方法比较特殊 是在特殊时刻自动触发 即不需要调用
常见魔术方法:
- __init__() 对象创建时自动调用的方法
- __str__() 函数有返回值 当打印对象名的时候自动调用
- __del__() 当删除引用时自动调用
- __call__() 当执行 对象名() 时自动调用 即把对象当成函数使用
——————————
类方法特点:
类方法中不能调用普通方法
类方法调用:
- 对象名.方法名()
- 类名.方法名()
——————————
静态方法主要是用来存放逻辑性的代码
逻辑上她是属于类 但是和类本身没有关系!
也就是说在静态方法中不会涉及到类中的属性和方法的操作
可以理解为:
静态方法是个独立的单纯的函数仅仅托管于某个类的名称空间中以便于使用和维护
静态方法调用:
- 对象名.静态方法名()
- 类名.静态方法名()
——————————
%%%%%
普通方法:
可调用普通方法 使用 self.方法名()
可调用静态方法 使用 类名.方法名()
可调用类方法 使用 类名.类名.方法名()
%%%%%
静态方法:
不可调用普通方法
可调用类方法 方式为 类名.方法名()
可调用静态方法 方式为 类名.方法名()
%%%%%
类方法:
不可调用普通方法
可调用类方法 使用 类名.方法名() 方式
可调用静态方法 使用 类名.方法名() 方式
##################################################
——————————
内部类:
内部类是在类的内部定义的类
主要是为了更好的抽象现实世界!
一般情况下不使用内部类 这样会使程序结构复杂
但是理解内部类有助于理解模块的调用
调用内部类有两种方式:
直接使用外部类调用内部类
或者先对外部类进行实例化 然后再实例化内部类
示例创建内部类:
- Microsoft Windows [版本 6.3.9600]
- (c) 2013 Microsoft Corporation。保留所有权利。
-
- C:\Users\byme>python
- Python 3.10.5 (tags/v3.10.5:f377153, Jun 6 2022, 16:14:13) [MSC v.1929 64 bit (AMD64)] on win32
- Type "help", "copyright", "credits" or "license" for more information.
- >>> class A:
- ... i = 0
- ... class a():
- ... i = 1
- ... class b:
- ... i = 2
- ...
- >>> A_1 = A()
- >>> print(A_1.i)
- 0
- >>>
上面例子中在 A 类中又定义了 a 类和 b 类两个内部类:
- class A:
- i = 0
- class a():
- i = 1
- class b:
- i = 2
然后创建了外部类 A 的实例化对象
A_1 = A()
该实例对象的 i 值为 0
创建内部类的实例化对象 可以通过外部类的实例化对象调用内部类完成:
- >>> A_2 = A_1.a()
- >>> print ( A_2.i )
- 1
- >>>
也可以直接使用外部类名调用内部类
- >>> A_3 = A.b()
- >>> print (A_3.i)
- 2
- >>>