py9_详解 Python 类属性/类方法 以及如何转换类方法和静态方法

##################################################

目录

活动简介

Python 类属性和类方法

类的属性和方法最通俗易懂的解释方式

Python 类的属性

两种方式访问类的属性

Python 公有属性

Python 私有属性

Python 内置属性

Python 类的方法

Python 公有方法

Python 私有方法

Python 类方法

Python 静态方法

上述四种方法的总结示例


##################################################

活动简介

活动地址: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)

        解释运行成功没有报错:

解释运行成功没有报错

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

燃吹

呜呜呜没钱钱吃饭了……

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值