面向对象——python中类的创建

这篇具有很好参考价值的文章主要介绍了面向对象——python中类的创建。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

面向对象编程——Object Oriented Programming,简称OOP,是一种以对象为中心的程序设计思想。很多高级开发语言都是面向对象的,例如,如雷贯耳的Java、谷歌新推的Kotlin、开发iOS的Objective-C、苹果新推的Swift,以及C++、C#等都是面向对象的。Python也不例外,这篇文章将介绍python中类的创建。

一,常见的创建方式

在python中,最为常用也是最为简单的创建类的方式便是通过关键字 'class' 进行创建,在python3中通常会继承 object 类,下面我们来通过class创建一个类Foo1,并实例化一个对象obj1:

class Foo1(object):
    v1 = 123

    def __init__(self):
        print("创建Foo1")

obj1 = Foo1()
#输出 "创建Foo1" 

在Foo1中,我们定义了它的 __init__() 方法,作为python预定义的构造函数,在对类进行实例化时会自动执行这个方法。

二,使用type创建类

type()函数最常见的用法便是查看变量的类型,如:

arr=[1,2,3,4]
print(type(arr))
#输出 "<class 'list'>"

而当使用type函数查看类和实例后的类对象的类型时:

class Foo1(object):
    pass

obj1 = Foo1()

print(type(Foo1))  #输出 <class 'type'>
print(type(obj1))  #输出 <class '__main__.Foo1'>

可以发现,类Foo1的类型为 'type' ,实例后的类对象obj1的类型是 <class '__main__.Foo1'> 。

实际上 Python 允许使用 type() 函数(相当于 type 类的构造器函数)来创建 type 对象,又由于 type 类的实例就是类,因此 Python 可以使用 type() 函数来创建类,来看看type类的源码:

class type(object):
    """
    #传入参数只有object时,返回其类型
    type(object) -> the object's type
    
    #创建一个新类
    type(name, bases, dict, **kwds) -> a new type
    """
        
        #创建一个空白类
        def __new__(*args, **kwargs):
         # real signature unknown
        """ Create and return a new object.  See help(type) for accurate signature. """
        pass

        

        def __init__(cls, what, bases=None, dict=None): 
        # known special case of type.__init__
        """
        type(object) -> the object's type
        type(name, bases, dict, **kwds) -> a new type
        # (copied from class doc)
        """
        pass

在创建一个新的类时,type会先调用其 __new__()方法创建一个空白的类,然后才会调用 __init__()方法进行构造,看看构造函数中这句话:

type(name, bases, dict, **kwds) -> a new type

'name'就是要创建的类的名字,‘bases’是想要继承的类,'dict'是要用字典类型封装类的成员,比如各种变量和方法。下面我们来使用type新建一个类Foo2,并实例化一个对象obj2:

​Foo2 = type(
    "Foo2",    #类的名字
    (object,), #继承的类
    
    #字典封装的成员
    {
        "v1": 123,     
        #通过lamba实现构造函数
        "__init__": lambda self: print("创建Foo2")
    }
)

obj2 = Foo2()

# 输出 "创建Foo2"

​

我们使用"type"创建了一个新的类Foo2, 我们便将其称为元类。Python中所有的东西都是对象,包括整数、列表以及类。它们全部都是对象,而且它们都是从一个类创建而来,这个类就是type。type就是Python的内建元类,当然了,我们也可以通过继承type来创建自己的元类。

三,继承type类的类来创建的类

我们先来创建一个继承了type类的新类Mytype:

class Mytype(type):
    # 新建一个空白类
    def __new__(cls, name, bases, attrs):
        # 创建新的类对象
        xx = super().__new__(cls, name, bases, attrs)
        print('创建类', xx)
        return xx

我们重写了父类type的 __new__() 方法,让他能够在创建新类的时候打印出新的类的名字,现在我们来通过Mytpe创建一个新的类Foo3,并且实例化一个对象obj3:

Foo3 = Mytype(
    "Foo3", 
    (object,), 
    {
    "v1": 123,
     "__init__": lambda self: print("实例化一个Foo3对象")
     }
)
obj3 = Foo3()
print("v1的值为:",obj3.v1)

那么将会输出一下结果:

python创建类,python之路,python,开发语言

既然我们可以通过重写父类type的 __new__() 方法,让他能够在创建新类的时候打印出新的类的名字,我们同样可以通过这样的方式对创建的新类进行操作,注意到我们在创建Foo3时,定义了一个变量为 v1=123,下面我们通过Mytype将Foo3中的v1删除:

class Mytype(type):

    # 新建一个空白类
    def __new__(cls, name, bases, attrs):
        # 那么我们可以通过自定义Mytype,对创建的类进行操作
        del attrs['v1']
        # 在这一步创建新的类对象
        xx = super().__new__(cls, name, bases, attrs)
        print('创建类', xx)
        return xx

Foo3 = Mytype(
    "Foo3",
    (object,),
    {
    "v1": 123,
     "__init__": lambda self: print("实例化一个Foo3对象")
     }
)
obj3 = Foo3()
print(obj3.v1)
print("v1的值为:",obj3.v1)

那么不出意外的报错了AttributeError: 'Foo3' object has no attribute 'v1'

python创建类,python之路,python,开发语言

基于前面的Mytype,我们还可以通过这样的方式创建一个新类:

class Foo4(object,metaclass=Mytype):
    v1=123
    def __init__(self):
        print("创建类Foo4")

obj4=Foo4()

是的,就是在类中定义metaclass为你自己创建的新的元类。

四,总结

那么,总的那来说,元类的作用就是对要床架的类进行操作,比如删除或修改某个成员,拦截类的创建等。

然而,在实际开发中,通过元类对某个类进行操作显得有点小题大做了,开发者大可以直接在实例化的对象中直接对成员进行操作。但是,如果是一个要对一个框架进行操作,元类就有他的用武之地了,一个最为典型的例子就是python的web框架django 和 drf ,感兴趣的小伙伴可以去看看drf的序列化器Serializer的源代码。文章来源地址https://www.toymoban.com/news/detail-776223.html

到了这里,关于面向对象——python中类的创建的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python学习之路-面向对象:三个基本特征

    封装:根据职责将属性和方法封装到一个抽象的类中 继承:实现代码的重用,相同的代码不需要重复的编写 多态:不同的对象调用相同的方法,产生不同的执行结果,增加代码的灵活度 封装是面向对象编程的一大特点,面向对象编程的第一步就是将属性和方法封装到一个抽

    2024年02月02日
    浏览(58)
  • Python中类的继承细讲

      在编写类时,并不是每次都要从空白开始。当要编写的类和另一个已经存在的类之间 存在一定的继承关系 时,就可以 通过继承来达到代码重用 的目的,提高开发效率。下面将介绍如何在 Python 中实现 继承 。    继承 是 面向对象编程最重要的特性之一 ,它源于人们认

    2024年02月06日
    浏览(36)
  • 【知识点】python中类的相互调用

    在 Python 中,类可以相互调用。这意味着一个类可以访问另一个类的方法或属性。下面是几个例子: 在同一个文件内,不同类的相互调用例子如下: 代码 在上面的代码中, Dealership 类调用了 Car 类。它通过创建一个 Car 对象来添加汽车,并通过循环遍历汽车列表来显示汽车的

    2023年04月10日
    浏览(36)
  • Python中类的定义和使用细讲

      在 Python 中,类表示 具有相同 属性 和 方法 的 对象 的集合。在使用类时, 需要先定义类 ,然后 再创建类的实例 , 通过类的实例就可以访问类中的属性和方法 了。   在 Python 中,类的定义使用 class 来实现,语法如下: 参数说明 : ClassName :用于指定类名,

    2024年02月08日
    浏览(38)
  • C++ 类与对象中类的深入知识点+完整思维导图+基本练习题+深入细节+通俗易懂建议收藏

    本章我们接着对类和对象进行探索,这是一个在我们c++中比较重要的知识点,下面我们才是我们类和对象的更加深入且困难的知识点,希望你能通过这篇文章对类其有更加深入的了解。 话不多说安全带系好,发车啦(建议电脑观看)。 附:红色,部分为重点部分;蓝颜色为

    2024年02月04日
    浏览(64)
  • 类和对象(上)--关于面向对象,类的定义,访问限定符,this指针

    二次修订于date:2024:3:6 C语言是一们面向过程的语言,关注的是函数执行的过程,数据和方法是分离的。 C++是一门面向对象的语言,主要关注对象,将一件事情抽象成不同的对象,靠对象间的交互来完成。对象与对象之间的交互叫做消息(举例外卖系统中,分为快递小哥,

    2024年03月21日
    浏览(57)
  • 【python全栈开发】面向对象进阶

    实例变量:属于对象,每个对象中各自维护自己的数据。 类变量:属于类,可以被所有对象共享,一般用于给对象提供公共数据(类似于全局变量)。 类变量和实例变量的区别示例: 类变量和实例变量+继承问题: 通常来说,调用的变量不是对象变量时,就会去对应的类中

    2024年02月21日
    浏览(84)
  • 【C++练级之路】【Lv.2】类和对象(上)(类的定义,访问限定符,类的作用域,类的实例化,类的对象大小,this指针)

    欢迎各位小伙伴关注我的专栏,和我一起系统学习C++,共同探讨和进步哦! 学习专栏 : 《进击的C++》 C语言是 面向过程 的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。 C++是基于 面向对象 的,关注的是对象,将一件事情拆分成不同的对象,靠对象

    2024年02月03日
    浏览(48)
  • 头歌Educoder实验:C++ 面向对象 - 类的继承与派生

    第1关:公有继承 —— 学生信息类 任务描述 本关任务:采用公有继承设计学生信息类。 相关知识 继承 继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一。简单的说,继承是指一个对象直接使用另一对象的属性和方法。 C++ 中的继承关系就好比现实生

    2024年02月04日
    浏览(136)
  • 【C++】类和对象①(什么是面向对象 | 类的定义 | 类的访问限定符及封装 | 类的作用域和实例化 | 类对象的存储方式 | this指针)

    🔥 个人主页 : Forcible Bug Maker 🔥 专栏 : C++ 目录 前言 什么是面向对象? 类的定义 类的访问限定符及封装 访问限定符 封装 类的作用域 类的实例化 类对象的存储方式 this指针 结语 最早的C++版本(C with classes)中,最先加上的就是类的机制,它构成了面向对象编程(OOP)的

    2024年04月14日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包