zoukankan      html  css  js  c++  java
  • Python 的类其实是一个特殊的对象

    Python 中的类是一个特殊的对象。

    Python 中一切皆对象:

    • class AAA:定义的类属于类对象。
    • obj1 = AAA(): 属于实例对象。

    在程序运行时,类同样会被加载到内存,类是一个特殊的对象——类对象。

    类对象在内存中只有一份,使用一个类可以创建出很多个对象实例。

    除了封装实例的属性和方法外,类对象还可以拥有自己的属性和方法。

    通过 '类名.' 的方式可以访问类的属性或者调用类的方法。

    一、类属性

    类属性就是给类对象中定义的属性,通常用来记录与这个类相关的特征,类属性不会用于记录具体对象的特征。

    类属性的特点是,所有类的实例化对象都同时共享类属性,也就是说,类属性在所有实例化对象中是作为公用资源存在的。

    示例:
    在这里插入图片描述

    class Tool(object):
    
        # 使用赋值语句定义类属性,记录所有工具对象的数量
        count = 0
    
        def __init__(self, name):
            self.name = name
    
            # 让类属性的值+1
            Tool.count += 1
    
    # 1. 创建工具对象
    tool1 = Tool("斧头")
    tool2 = Tool("榔头")
    tool3 = Tool("水桶")
    
    # 2. 输出工具对象的总数
    print(Tool.count)  # 3
    

    属性的获取机制

    在 Python 中属性的获取存在一个向上查找机制。
    在这里插入图片描述
    在python中,通过 tool1.count 的方式是怎么获取属性的值的?

    首先,在 Tool 类中定义了类属性 count 和 实例属性 name,我们要访问 count 属性,是通过 Tool.count 的方式进行访问。但是在 Python中,除了可以用类名的方式来访问类属性,还可以使用对象变量的方式进行访问。

    假设我们实例化了 Tool 类,得到了对象 tool1,在调用 tool1.count 的时候,首先是查找的对象 tool1 中的对象,如果没有找到,那么解释器就会向上寻找类中的 count 属性,如果找到就输出,如果没有找到就报错。

    这就是 python 中的属性向上查找机制。

    因此,要访问类属性有两种方式:

    • 类名.类属性
    • 对象.类属性 (不推荐)

    注意:如果使用"对象.类属性 = 值"的赋值语句,只会给对象添加一个属性,而不会影响到类属性的值。

    示例:

    #Python学习交流群:778463939
    
    class Tool(object):
    
        # 使用赋值语句定义类属性,记录所有工具对象的数量
        count = 0
    
        def __init__(self, name):
            self.name = name
    
            # 让类属性的值+1
            Tool.count += 1
    
    # 1. 创建工具对象
    tool1 = Tool("斧头")
    tool2 = Tool("榔头")
    tool3 = Tool("水桶")
    
    # 2. 输出工具对象的总数
    tool3.count = 99
    print(tool3.count)  # 99
    print(Tool.count)  # 3
    

    二、类方法

    类方法就是针对类对象定义的方法,在类方法内部可以直接访问类属性或者调用其他的类方法。

    Python 类方法和实例方法相似,它最少也要包含一个参数,只不过类方法中通常将其命名为 cls,

    Python 会自动将类本身绑定给 cls 参数(注意,绑定的不是类对象)。

    语法如下:

    @classmethod
    def 类方法名(cls):
        pass
    

    类方法需要用修饰器 @classmethod 来标识,告诉解释器这是一个类方法。

    类方法的第一个参数应该是 cls,由哪一个类调用的方法,方法内的 cls 就是哪一个类的引用,这个参数和实例方法的第一个参数是 self 类似。

    和 self 一样,cls 参数的命名也不是规定的(可以随意命名),只是 Python 程序员约定俗称的习惯而已。

    通过 '类名.' 的方式调用类方法,调用方法时,不需要传递 cls 参数。

    在方法内部,可以通过 'cls.' 访问类的属性,也可以通过 'cls.' 调用其他的类方法。

    示例:
    在这里插入图片描述

    #Python学习交流群:778463939
    @classmethod
    def show_tool_count(cls):
        """显示工具对象的总数"""
        print("工具对象的总数 %d" % cls.count)
    

    三、静态方法

    在开发时,如果需要在类中封装一个方法,这个方法既不需要访问实例属性或者调用实例方法,也不需要访问类属性或者调用类方法,这个时候,可以把这个方法封装成一个静态方法。

    静态方法,其实就是我们学过的函数,和函数唯一的区别是,静态方法定义在类这个空间(类命名空间)中,而函数则定义在程序所在的空间(全局命名空间)中。

    静态方法:由类调用;无默认参数。

    语法如下:

    @staticmethod
    def 静态方法名():
        pass
    

    静态方法需要用修饰器 @staticmethod 来标识,告诉解释器这是一个静态方法。通过 '类名.' 的方式调用静态方法。

    静态方法没有类似 self、cls 这样的特殊参数,因此 Python 解释器不会对它包含的参数做任何类或对象的绑定。也正因为如此,类的静态方法中无法调用任何类属性和类方法。

    示例:

    class Dog(object):
    
        @staticmethod
        def run():
            
            # 不访问实例属性/类属性
            print("小狗要跑...")
    
    # 通过类名.调用静态方法 - 不需要创建对象
    Dog.run()
    
  • 相关阅读:
    sql编码造成的安全问题(基于mysql8.0版本)
    [HY000] [2054] php连接mysql时错误
    jetbrains(phpstrom,webstorm等)破解
    XSS(二)
    XSS(一)
    ctf中rsa攻击方法
    扩展欧几里得算法证明及求乘法逆元
    mac泛洪攻击&arp欺骗(python脚本)
    Flutter 中 实现 单选对话框 和页面中实现单选框
    解决Flutter混合开发时 is not a readable directory 问题
  • 原文地址:https://www.cnblogs.com/djdjdj123/p/13782891.html
Copyright © 2011-2022 走看看