Python中的类对象示例详解

抽象特点

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

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

到此这篇关于Python中类对象的文章就介绍到这了,更多相关Python类对象内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python 类对象和实例对象动态添加方法(分享)

    实例如下所示: class Person(): def __init__(self, name): self.name = name def print_name(self): print(self.name) p = Person('Li') import types p.print_name = types.MethodType(print_name, p) # 绑定函数到对象 p.print_name() @staticmethod def print_abc(): print('abc'

  • 把JSON数据格式转换为Python的类对象方法详解(两种方法)

    JOSN字符串转换为自定义类实例对象 有时候我们有这种需求就是把一个JSON字符串转换为一个具体的Python类的实例,比如你接收到这样一个JSON字符串如下: {"Name": "Tom", "Sex": "Male", "BloodType": "A", "Hobbies": ["篮球", "足球"]} 我需要把这个转换为具

  • Python实现JSON反序列化类对象的示例

    我们的网络协议一般是把数据转换成JSON之后再传输.之前在Java里面,实现序列化和反序列化,不管是 jackson ,还是 fastjson 都非常的简单.现在有项目需要用Python来开发,很自然的希望这样的便利也能在Python中体现. 但是在网上看了一些教程,讲反序列化的时候,基本都是转换为 dict 或者 array .这种编程方式我从情感上是无法接受的.难道是这些JSON库都不支持反序列化为类对象?我马上打消了这个念头,Python这样强大的脚本语言,不可能没有完善的JSON库. 于

  • Python类的定义、继承及类对象使用方法简明教程

    Python编程中类的概念可以比作是某种类型集合的描述,如"人类"可以被看作一个类,然后用人类这个类定义出每个具体的人--你.我.他等作为其对象.类还拥有属性和功能,属性即类本身的一些特性,如人类有名字.身高和体重等属性,而具体值则会根据每个人的不同:功能则是类所能实现的行为,如人类拥有吃饭.走路和睡觉等功能.具体的形式如下: # 例:类的概念 class 人类: 名字 = '未命名' # 成员变量 def 说话(内容): # 成员函数 print 内容 # 成员变量赋初始值 某人 =

  • Python 使用元类type创建类对象常见应用详解

    本文实例讲述了Python 使用元类type创建类对象.分享给大家供大家参考,具体如下: type("123") 可以查看变量的类型;同时 type("类名",(父类),{类属性:值,类属性2:值}) 可以创建一个类. 在Python中不建议一个函数具有不同的功能(重载):type()具有不同的功能是为了兼容之前的版本. 类可以创建实例对象,类对象是由元类创建的. (元类创建类,类创建实例对象) type就是元类(type本质上就是一个类) demo.py(用元类t

  • Python 类属性与实例属性,类对象与实例对象用法分析

    本文实例讲述了Python 类属性与实例属性,类对象与实例对象用法.分享给大家供大家参考,具体如下: demo.py(类属性,所有实例对象共用类属性): # 定义工具类 继承object是为了兼容python2.x class Tool(object): # 使用赋值语句定义类属性,记录实例化工具对象的数量 count = 0 def __init__(self, name): self.name = name # 初始化方法内部定义及初始化实例属性 # 类名.类属性名 的方式访问类属性. To

  • Python中的类对象示例详解

    抽象特点 Python 一切皆对象,基于此概念,对 类 class 有以下特点: 类与实例的属性 类对象创建可选择定义类属性,创建实例对象时,实例属性自动执行类的__init__方法初始化 实例对象自动继承相应的类属性(如果有),但实例属性优先级更高 实例方法,类方法,静态方法的参数 实例方法是一般函数但实例方法需要传入self参数(与一般函数的区别) 类方法和静态方法是通过装饰器实现的函数,类方法需要传入cls参数,静态方法无需传入self参数或者是cls参数(但也能传入参数) 其中self参

  • Python中图像算术运算的示例详解

    目录 介绍 算术运算:图像相加 算术运算:图像减法 位运算 介绍 还记得你在小学时学习如何加减数字吗?现在,你也可以对图像做同样的事情! 输入图像可以进行算术运算,例如加法.减法和按位运算(AND.OR.NOT.XOR).这些操作可以帮助提高输入照片的质量. 在本文中,你将了解使用 OpenCV Python 包对图像执行算术和按位运算的步骤.让我们开始吧! 对图像进行算术运算是什么意思? 因此,假设我们希望合并两张单独的照片中的两个像素.我们怎样才能将它们合并? 让我们想象以下场景.第一个像素

  • Python中的Super用法示例详解

    目录 Python Super用法 附:super的典型用法 总结 Python Super用法 这篇文章我们来介绍一下 super,我相信大部分的人使用 super 都是使用这种方式: # 就是我有一个 class 比如说是 Male,然后继承另外一个 class 比如是 Person,然后我在这个 Male 也就是它的子类的 init 函数里面用 super().__init__() 来调用它父类的初识化函数 from objprint import op class Person: def

  • python中cPickle类使用方法详解

    在python中,一般可以使用pickle类来进行python对象的序列化,而cPickle提供了一个更快速简单的接口,如python文档所说的:"cPickle – A faster pickle". cPickle可以对任意一种类型的python对象进行序列化操作,比如list,dict,甚至是一个类的对象等.而所谓的序列化,我的粗浅的理解就是为了能够完整的保存并能够完全可逆的恢复.在cPickle中,主要有四个函数可以做这一工作,下面使用例子来介绍. 1. dump: 将pyth

  • Python中的面向接口编程示例详解

    前言 "面向接口编程"写 Java 的朋友耳朵已经可以听出干茧了吧,当然这个思想在 Java 中非常重要,甚至几乎所有的编程语言都需要,毕竟程序具有良好的扩展性.维护性谁都不能拒绝. 最近无意间看到了我刚开始写 Python 时的部分代码,当时实现的需求有个很明显的特点: 不同对象具有公共的行为能力,但具体每个对象的实现方式又各不相同. 说人话就是商户需要接入平台,接入的步骤相同,但具体实现不同. 作为一个"资深" Javaer,需求还没看完我就洋洋洒洒的把各个实现

  • python案例中Flask全局配置示例详解

    目录 WEB服务全局配置 Flask全局配置 before_request after_request Flask自定义中间件 WEB服务全局配置 在目前的开发过市场当中,有很多WEB服务框架,Flask只是其中之一,但是总体上来看,所有的WEB框架都是依据HTTP协议的逻辑从请求到响应设计的.固然有很多功能是独立的,但是也有一部分功能需要全局设定,比如安全校验,比如埋点日志,那么这里就用到了全局配置. 所谓的全局配置,就是在框架全局,请求前后,响应前后,设置的全局配置,比如登录校验,这个功能并

  • Python 中迭代器与生成器实例详解

    Python 中迭代器与生成器实例详解 本文通过针对不同应用场景及其解决方案的方式,总结了Python中迭代器与生成器的一些相关知识,具体如下: 1.手动遍历迭代器 应用场景:想遍历一个可迭代对象中的所有元素,但是不想用for循环 解决方案:使用next()函数,并捕获StopIteration异常 def manual_iter(): with open('/etc/passwd') as f: try: while True: line=next(f) if line is None: br

  • Python 中Pickle库的使用详解

    在"通过简单示例来理解什么是机器学习"这篇文章里提到了pickle库的使用,本文来做进一步的阐述. 那么为什么需要序列化和反序列化这一操作呢? 1.便于存储.序列化过程将文本信息转变为二进制数据流.这样就信息就容易存储在硬盘之中,当需要读取文件的时候,从硬盘中读取数据,然后再将其反序列化便可以得到原始的数据.在Python程序运行中得到了一些字符串.列表.字典等数据,想要长久的保存下来,方便以后使用,而不是简单的放入内存中关机断电就丢失数据.python模块大全中的Pickle模块就派

  • Python面向对象编程repr方法示例详解

    目录 为什么要讲 __repr__ 重写 __repr__ 方法 str() 和 repr() 的区别 为什么要讲 __repr__ 在 Python 中,直接 print 一个实例对象,默认是输出这个对象由哪个类创建的对象,以及在内存中的地址(十六进制表示) 假设在开发调试过程中,希望使用 print 实例对象时,输出自定义内容,就可以用 __repr__ 方法了 或者通过 repr() 调用对象也会返回 __repr__ 方法返回的值 是不是似曾相识....没错..和 __str__ 一样的

随机推荐