##################################################
目录
##################################################
活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰;一个人摸索学习很难坚持,想组团高效学习;想写博客但无从下手,急需写作干货注入能量;热爱写作,愿意让自己成为更好的人…
…
欢迎参与CSDN学习挑战赛,成为更好的自己,请参考活动中各位优质专栏博主的免费高质量专栏资源(这部分优质资源是活动限时免费开放喔~),按照自身的学习领域和学习进度学习并记录自己的学习过程,或者按照自己的理解发布专栏学习作品!
##################################################
——————————
类的定义由属性和方法组成
属性是对数据的封装
方法则是对类行为的封装
——————————
Python 语言中的属性操作遵循三个规则:
属性的获取是按照从下到上的顺序来查找属性
类和实例是两个完全独立的对象
属性设置是针对实例本身进行的
属性按使用范围分为公有属性和私有属性
使用范围取决于属性名称
%%%%%
关于访问类的属性有两种方式:
- 类.属性
- 实例对象.属性
示例通过类访问:
- >>> class Test:
- ... a = 1
- ... b = "ooxx"
- ...
- >>> Test.a
- 1
- >>> Test.b
- 'ooxx'
- >>> Test.a = 2
- >>> Test.b = "xxoo"
- >>> Test.a
- 2
- >>> Test.b
- 'xxoo'
- >>>
示例通过单个实例对象访问:
- >>> test = Test()
- >>> test.a
- 2
- >>> test.b
- 'xxoo'
- >>> test.a = 1
- >>> test.a
- 1
- >>> test.b = "ooxx"
- >>> test.b
- 'ooxx'
- >>>
%%%%%
公有属性:
类中和类外调用的属性
变量默认都是公有属性
%%%%%
私有属性:
不能被类以外的函数调用的属性
命名以双下划线 __ 开始的成员变量就是私有属性
可以通过
instance._ClassName__attribute
实例._类名__属性
方式访问
示例:
- 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 Test:
- ... __name = 10
- ...
- >>> te = Test()
- >>> te._Test__name
- 10
- >>>
%%%%%
内置属性:
由系统在定义类的时候默认添加的
命名一般由前后各两个下划线 __ 组成
例如 __dc__
内置类属性:
- __name__ 类名字
- __doc__ 类的文档字符串
- __bases__ 所有父类构成的元组
- __dict__ 类的属性
- __module__ 类定义所在的模块
- __class__ 新式类中实例对应的类
示例:
- >>> class Test:
- ... __name = 10
- ...
- >>> Test.__name__
- 'Test'
- >>> Test.__doc__
- >>> Test.__bases__
- (<class 'object'>,)
- >>> Test.__dict__
- mappingproxy({'__module__': '__main__', '_Test__name': 10, '__dict__':
'__dict__' of 'Test' objects>, '__weakref__': '__weakref__' of 'Test' objects>, '__doc__': None}) - >>> Test.__module__
- '__main__'
- >>> Test.__class__
- <class 'type'>
- >>>
内置实例属性:
- __class__ 实例对象所属的类名
- __dict__ 实例对象的属性
示例:
- >>> te = Test()
- >>> te.__class__
- <class '__main__.Test'>
- >>> dict.__class__
- <class 'type'>
- >>>
——————————
类方法也包括公有方法、私有方法、类方法和静态方法
后两者类似于 C ++ 中的函数重载
由于 Python 没有这样的功能因此使用了类方法和静态方法
类方法和静态方法原理上有以下区别:
- 静态方法不能使用 self 的方式调用
-
- 静态方法调用时会预先将类中用到的属性和方法进行加载
- 而类方法则是随调随用
- 因此类方法相比静态方法具有不占资源的优势
- 但是类方法速度不及静态方法
-
- 静态方法调用类中的属性时需要使用
- 类名.属性
- 的格式
%%%%%
公有方法:
不能被类直接调用 需要使用实例化对象调用
示例公有方法:
- def func_1(self):
- # 一般的都是公有方法
%%%%%
私有方法:
不能被外部的类和方法调用
需要在方法的前面加上双下划线 __
示例私有方法:
- def __func_2(self):
- # 私有方法前面要加 __
%%%%%
类方法:
能被类所调用 也能被对象所调用
被 classmethod 函数调用或被 @classmethod 装饰器修饰
示例装饰器修饰类方法:
- @classmethod
- def fun_3(self):
- # 用 @classmethod 声明类方法
还有一种 就是将函数转换成
classmethod() 被认为是不符合 Python 规范的
所以比较推荐在较新的 Python 版本中用 @classmethod 装饰器来定义类方法
就是将需要转换成类方法的方法转换并返回:
- def func_4(self):
- # 这是 Test 类中的一个普通函数 func_4
-
- Test.func_4 = classmethod(Test.func_4) # 类.方法 = classmethod(类名.方法名)
%%%%%
静态方法:
相当于全局方法 可以被类直接调用 也可以被所有实例化对象共享
该方法通过调用 staticmethod 方法或被 @staticmethod 装饰器来声明
静态方法不需要 self 语句
示例装饰器修饰静态方法:
- @staticmethod
- def fun_5():
- # 静态方法用 @staticmethod 装饰器修饰声明 不需要加 self
示例另一种方式 将方法转换成静态方法:
- def fun_6():
- # 这是一个普通方法 未加 self 参数
-
- Test.func_6 = staticmethod(Test.fun_6) # Test 类中的静态方法 func_6 被 staticmethod() 调用转换成了静态方法返回
%%%%%
没有注释 很简单的都能看得懂:
- class Test:
-
- def fun_1(self):
- print ( "这是一个公开方法" )
-
- def __func_2(self):
- print ( "这是一个私有方法" )
-
- @classmethod
- def fun_3(self):
- print ( "这是用 @classmethod 装饰器修饰的类方法" )
-
- def func_4(self):
- print ( "这是待转换成类方法的的普通函数 func_4" )
- func_4 = classmethod(func_4)
-
- @staticmethod
- def fun_5():
- print ( "这是用 @staticmethod 装饰器修饰的静态方法" )
-
- def fun_6():
- print ( "这是待转换成静态方法的的未加 self 参数的普通函数 func_4" )
- func_6 = staticmethod(fun_6)
解释运行成功没有报错:
