【Python】一篇拿下类属性与类方法详解【超详细的注释和解释】

在这里插入图片描述



前言

先赞后看好习惯 打字不容易,这都是很用心做的,希望得到支持你 大家的点赞和支持对于我来说是一种非常重要的动力 看完之后别忘记关注我哦!️️️

今天给大家带来的是python的类的一些详细介绍
我们知道,类有三大属性:封装、继承、多态
今天,我们将会对类的本身进行一些讨论,讨论类的属性和方法。
类的属性其实就是对应C++中成员变量
类的方法其实就是对应C++中成员函数


那么这里博主先安利一下一些干货满满的专栏啦!

数据结构专栏:数据结构 这里包含了博主很多的数据结构学习上的总结,每一篇都是超级用心编写的,有兴趣的伙伴们都支持一下吧!
算法专栏:算法 这里可以说是博主的刷题历程,里面总结了一些经典的力扣上的题目,和算法实现的总结,对考试和竞赛都是很有帮助的!
力扣刷题专栏:Leetcode 想要冲击ACM、蓝桥杯或者大学生程序设计竞赛的伙伴,这里面都是博主的刷题记录,希望对你们有帮助!
C的深度解剖专栏:C语言的深度解剖 想要深度学习C语言里面所蕴含的各种智慧,各种功能的底层实现的初学者们,相信这个专栏对你们会有帮助的!


类的实例化

类的实例化用代码来表示其实就是,我们定义了类之后,我们创建一个类对象的过程。

	class Test:# Test()这里可以跟括号,表示继承哪一个类
        # 如果不写默认继承object类
        def func(self):
            pass
        # ...
    t=Test() #这个就是类的实例化

类的非静态属性或方法(实例属性和方法)

类的非静态属性即对标C++中的非静态成员变量

要注意的点:

  • python中的非静态成员变量只能写在成员函数里面,不能写在外面(这里和C++是有区别的)
  • 成员函数的括号内有必须写参数,第一个参数一定要是self(这个和C++类中的this指针类似,区别在于this指针我们是不用显式去写的,但是在Python中,这个self我们一定是要加上的)
  • 成员函数可以带缺省参数(和C++的是同一个意思,即在形参后面赋值,当函数被传参了,缺省参数不起作用,函数没有被传参,缺省参数起作用)
  • 定义成员属性的时候要加上self.具体可以看代码中的例子
	class Test:  
        """
        这是一个用来测试的类
        """
        def Print(self): # 这里是一个实例/方法(java)/成员函数(C++)
            # 必须带一个self,self必须是第一个参数
            # 表示当前这个实例的引用 和this指针类似
            self.x=10 # 在另外的成员函数中定义也是可以的
            print('hehe',self.x)
        # 实例属性必须在实例方法中创建 -- 也就是必须在def里面创建
        # 这里和C++是不一样的,C++我们一般都是在成员函数外面去定义,这里是里面

当然,我们可以把非静态成员变量统一放在另一个成员函数里面

    class Test:  # Test()这里可以跟括号,表示继承哪一个类
        # 如果不写默认继承object类
        """
        这是一个用来测试的类
        """
        def Init(self,num=10): # 也可以带缺省参数
            self.x=num
        def Print(self): # 这里是一个实例/方法(java)/成员函数(C++)
            # 必须带一个self,self必须是第一个参数
            # 表示当前这个实例的引用 和this指针类似
            print('hehe',self.x)
	
	t=Test()
	t.Init()  #先调用Init()
	t.Print()

通过代码我们可以发现
我们要先调用Init(),我们的x才能用
下面的Print()才能正常使用我们的x
这样其实比较麻烦

那么有没有一种方法,可以不这样做呢?
有的,其实就是构造函数
我们知道,一个类被实例化的时候,会自动调用这个类的构造函数,这个是不需要我们自己去手动调用的

  • Python中类的构造函数名称是__init__

也就是我们python解释器,在类的实例化的时候会自动调用一个名叫__init__的函数,如果我们不写,解释器也会自动调用

有了这种方法我们就可以改写上面那些的代码了

    class Test: 
        """
        这是一个用来测试的类
        """
        def __init__(self,num=10): # 也可以带缺省参数
            self.x=num
        def Print(self): 
            print('hehe',self.x)
		# 这样我们使用一个__init__构造函数,我们后面就不用手动调用了
		# 

方法总结:

  • 因此通常我们构造python类的时候我们都把一个类的
    实例属性(成员变量)全都写到__init__里面
    都集中写到里面去即可

  • 当然 构造函数也可以传参缺省参数


类的静态属性和方法

静态属性(静态成员变量)

当然,python中的类也支持静态成员变量 在C++/java中,加了static,这个变量就和实例无关,只和类相关的东西了
也就是我们不需要实例化类,也可以用这个变量
python的类中的静态成员变量 – 只需要写到成员函数外面即可

    class Test:
        val=10
        def __init__(self):
            x=10
            y=20
        def Print():
            print("hehe")
    print(Test.val) # 无需将类实例化 -- 也可以使用val

静态方法

看到这里,我们自然会想:python里面的静态成员函数是怎么样的呢?

  • 首先我们可以想到的,就是不传self,因为是静态的,所以和self没有关系,不传self难道就是静态的了吗?
    答案是否定的,我们还需要多加一个对函数的修饰语句
	def StaticPrint():  # 不传this指针 -- 
	# 也就是self 我们就是静态成员函数了吗
            # 还不是 -- 还需要画龙点睛之笔
            print('static_haha') 
    StaticPrint=staticmethod(StaticPrint) 
    #把我们的函数设置成静态的

但是这样写,我们就要多写一句话,以上是方法一,我们还有一种方法:

        @staticmethod
        def StaticPrint():  
            print('static_haha') 
        # 使用python中的@
        # 这个是装饰器

总结:将函数编程静态的两种方法:

  • 在函数后面补上staticmethod()语句
  • 在函数前使用@staticmethod装饰器

此时这个静态函数就是我们想要的静态成员函数了吗?
其实不是,我们通过测试可以发现,这个设置为静态之后的函数,并不能访问我们的成员变量!
在这里插入图片描述
这里可以说明了,我们在这一小节说的这个静态函数,仅仅只是静态方法,不能说是和C++静态成员函数对标的类方法

类方法(静态成员函数)

处理方式:
@classmethod 表示类方法

        @classmethod
        def ClassPrint(cls):
            """类方法"""
            # cls表示当前类
            print("hehe",cls.val)

这个才是真正的类方法,真正的静态成员函数!

总结

  1. 实例属性(非成员变量)
  2. 实例方法(非静态成员函数)
  3. 类属性(静态成员变量)
  4. 类方法(静态成员函数)
  5. 静态方法

属性的访问权限

  • Python中使用双下划线前缀表示私有 – 相当于private,其它都是public
    # Python中使用双下划线前缀表示私有 -- 相当于private
    class Test:
        def __init__(self):
            self.__x=10   #私有
    
    t=Test()
    print(t._x) #无法访问,因为__x是私有属性

尾声

看到这里,相信我们对Python中的类的一些基本信息已经了解了。
其实类的三大属性是:封装、继承、多态
博主会在以后的文章里给大家详细讲解(C++和Python)的都会有。所以还是希望大家一键三连支持一下!点赞!收藏!关注!

posted @ 2022-07-26 01:06  背包Yu  阅读(291)  评论(0编辑  收藏  举报  来源