##################################################
目录
##################################################
活动简介
活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰;一个人摸索学习很难坚持,想组团高效学习;想写博客但无从下手,急需写作干货注入能量;热爱写作,愿意让自己成为更好的人…
…
欢迎参与CSDN学习挑战赛,成为更好的自己,请参考活动中各位优质专栏博主的免费高质量专栏资源(这部分优质资源是活动限时免费开放喔~),按照自身的学习领域和学习进度学习并记录自己的学习过程,或者按照自己的理解发布专栏学习作品!
##################################################
Python 类属性和类方法
——————————
类的属性和方法最通俗易懂的解释方式
类的定义由属性和方法组成
属性是对数据的封装
方法则是对类行为的封装
——————————
Python 类的属性
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'
>>>
%%%%%
Python 公有属性
公有属性:
类中和类外调用的属性
变量默认都是公有属性
%%%%%
Python 私有属性
私有属性:
不能被类以外的函数调用的属性
命名以双下划线 __ 开始的成员变量就是私有属性
可以通过
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
>>>
%%%%%
Python 内置属性
内置属性:
由系统在定义类的时候默认添加的
命名一般由前后各两个下划线 __ 组成
例如 __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__': <attribute '__dict__' of 'Test' objects>, '__weakref__': <attribute '__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'>
>>>
——————————
Python 类的方法
类方法也包括公有方法、私有方法、类方法和静态方法
后两者类似于 C ++ 中的函数重载
由于 Python 没有这样的功能因此使用了类方法和静态方法
类方法和静态方法原理上有以下区别:
静态方法不能使用 self 的方式调用
静态方法调用时会预先将类中用到的属性和方法进行加载
而类方法则是随调随用
因此类方法相比静态方法具有不占资源的优势
但是类方法速度不及静态方法
静态方法调用类中的属性时需要使用
类名.属性
的格式
%%%%%
Python 公有方法
公有方法:
不能被类直接调用 需要使用实例化对象调用
示例公有方法:
def func_1(self):
# 一般的都是公有方法
%%%%%
Python 私有方法
私有方法:
不能被外部的类和方法调用
需要在方法的前面加上双下划线 __
示例私有方法:
def __func_2(self):
# 私有方法前面要加 __
%%%%%
Python 类方法
类方法:
能被类所调用 也能被对象所调用
被 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(类名.方法名)
%%%%%
Python 静态方法
静态方法:
相当于全局方法 可以被类直接调用 也可以被所有实例化对象共享
该方法通过调用 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)
解释运行成功没有报错: