当前位置 博文首页 > Python中的类对象示例详解

    Python中的类对象示例详解

    作者:大虾昊 时间:2021-05-04 18:12

    抽象特点

    Python 一切皆对象,基于此概念,对 类 class 有以下特点:

    类与实例的属性

    类对象创建可选择定义类属性,创建实例对象时,实例属性自动执行类的__init__方法初始化

    实例对象自动继承相应的类属性(如果有),但实例属性优先级更高

    实例方法,类方法,静态方法的参数

    实例方法是一般函数但实例方法需要传入self参数(与一般函数的区别)

    类方法和静态方法是通过装饰器实现的函数,类方法需要传入cls参数,静态方法无需传入self参数或者是cls参数(但也能传入参数)

    其中self参数必须指向实例对象,cls参数指向定义的类对象(self与cls是约定俗成的,原则上可以用其它名字)

    方法与函数

    其中方法是在对象语境下的函数,实例调用实例方法即调用方法,类调用实例方法即调用函数

    具体细节

    类举例

    class Toy(object): # 此处此类可理解为设计一个Toy的蓝图
      # 赋值定义类属性,记录所有玩具数量
      count = 0
    
      def __init__(self, name): # 用于实例初始化
        self.name = name
        # 类属性 +1
        Toy.count += 1
    
      @classmethod # 此装饰器表示是类方法,类方法无需创建实例对象即可调用,最为灵活
      def show_toy_count(cls):
        print('玩具对象的数量 %d' % cls.count, cls)
    
      @staticmethod # 此装饰器表示是静态方法,静态方法本质上是封装在类对象内的的函数,常用于测试
      def hi():
        print('Hello!')
    
      # 实例方法
      def beybey(self):
        print('Sad!', self)
    
    
    # 创建实例对象
    toy1 = Toy('乐高')
    toy1.hand = 2
    toy2 = Toy('泰迪熊')
    toy3 = Toy('哥斯拉')
    print(toy1.name, toy2.name, toy3.name)
    
    # 点语法调用类方法与静态方法,如:类名.方法
    Toy.show_toy_count()
    Toy.hi()
    # 实例对象调用类方法时,与类对象调用类方法无异,但实际上调用仍通过实例对象继承的类对象
    toy1.show_toy_count()
    print(toy1.hand)
    # 实例对象调用静态方法时,与类对象调用静态方法无异,但实际上调用仍通过实例对象继承的类对象
    toy2.hi()
    # 实例对象调用实例方法,Python的解释器内部,当我们调用toy3.beybey()时,实际上Python解释成Toy.beybey(toy3)
    toy3.beybey()
    # Toy.beybey() # 错误语法,self必须指向实例对象,此处实例方法指向类对象而不是实例对象
    Toy.beybey(toy3)
    # 类与其实例的类型和内存地址
    print(type(Toy), id(Toy), type(toy3), id(toy3))
    

    输出结果

    乐高 泰迪熊 哥斯拉
    玩具对象的数量 3 <class '__main__.Toy'>
    Hello!
    玩具对象的数量 3 <class '__main__.Toy'>
    2
    Hello!
    Sad! <__main__.Toy object at 0x000001FD9F794D60>
    Sad! <__main__.Toy object at 0x000001FD9F794D60>
    <class 'type'> 2188806599664 <class '__main__.Toy'> 2188813880672

    类方法与静态方法举例

    class Cat: # 或者class Cat()不写父对象形式定义类对象,会默认继承祖先object对象
      name = '小敏'
    
      @classmethod
      def www(cls):
        print('%s 干嘛!' % cls.name)
        # cls.call() # 类方法可以调用静态方法
    
      @staticmethod
      def call():
        print('喵喵~')
        Cat.name = '小敏臭弟弟'
        print(Cat.name)
        # Cat.www() # 静态方法可以调用类方法
    
    
    Cat.www()
    Cat.call()
    # 没有定义实例方法可以创建实例对象继承并使用其中方法
    cat1 = Cat()
    cat1.www()
    cat1.call()
    

    输出结果

    小敏 干嘛!
    喵喵~
    小敏臭弟弟
    小敏臭弟弟 干嘛!
    喵喵~
    小敏臭弟弟

    祖先对象中包含的基本方法

    print(dir(object))
    
    ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
    

    总结

    类 class 是 Python 中最核心的对象,定义类通常要写好类属性,实例方法,类方法,静态方法等几部份。把类和继承的类的实例比作函数中的主函数和子函数,那么类属性可认为是全局变量,实例属性可认为是局部变量;把类看成葫芦,实例方法则是方便我们照画瓢的同时,提供因地制宜的可能;类方式能够使我们更高效的使用类的功能而静态方法往往能帮助我们了解类的功能。

    类 的各方法间并不是彼此毫不相干,而是有着很强的共性,具体使用时应灵活运用,不应局限在抽象的定义之中。

    js