在python中创建对象(object)

2023-05-16

该系列文章:

  • 《python入门,编程基础概念介绍(变量,条件,函数,循环)》
  • 《python中的数据类型(list,tuple,dict,set,None)》
  • 《在python中创建对象(object)》

在上一篇文章《python中的数据类型(list,tuple,dict,set,None)》的1.2小节里我们就简要介绍过对象(object)跟类(class)的概念。也知道了python中内置的所有数据类型都是对象,拥有自己的方法。那么当这些内置的数据类型无法满足我们的需求时,我们如何创建我们自己的类型(type)呢?答案就是通过创建我们自己的类(class)。通过我们自己动手实现的类,我们就可以创建以这个类为模板的对象。从这样的流程来看,面向对象的编程方式是自顶而下,首先需要全盘考虑,才能创建一个足够好的模板,也即类。然后才能将类实例化为对象,通过对象中的属性来解决问题或者与其他对象互动。

创建一个最简单的类可以通过下面这样的写法:

class User:
    pass
    #更多代码
    #更多代码

复制代码

上面的代码中class是关键字,表明我们要创建一个类了,User是我们要创建的类的名称。通过“:”和缩进来表明所有缩进的代码将会是这个类里的内容。从User类中创建一个该类的实例通过下面的写法:

"""
创建一个实例,通过类名加括号的形式,类似调用函数
"""
u=User()

复制代码

对象(客体)有自己的特征和自己可以做到的事,对应到程序里就是字段(field)方法(method) ,这两个都是对象的属性(attribute) 。对象的字段类似于普通变量,所不同的是对象的字段是对象独有的。对象的方法类似于普通函数,所不同的是对象的方法是对象独有的。上篇文章中我们已经见到过如何使用字段跟方法,那就是通过.操作符。

1.0.定义方法(method)

在类中定义对象的方法(method)比较简单,跟实现普通函数类似,只有一点不同,那就是不管方法需不需要参数,你都需要把self作为一个参数名传进去,self这个参数在我们调用方法时我们可以直接忽略,不赋值给它。举个例子:

class User:
    def hi(self):
        print("hi!")

u=User()
u.hi()

"""
程序输出:
hi!
"""

复制代码

self这个参数名是约定俗成的。在User类的代码块里定义hi方法时,传入的参数self将会是某个实例(对象)本身。当u作为User类的实例被创建,并且通过u.hi()调用hi方法时,python解释器会自动将其转换成User.hi(u)。通过传入实例(对象)本身,也即self,方法(method)就能够访问实例的字段(filed),并对其进行操作,我们之后可以从新的例子中看到。

1.1.声明字段(field)

要在类中声明对象的字段,有一个特殊的方法(method)可以做到,那就是__init__方法,这个方法在init前后都要写上两个下划线____init__方法会在实例一开始创建的时候就被调用,initinitialization的缩写,顾名思义,就是初始化的意思。__init__方法在创建对象的时候由python解释器自动调用,不需要我们手动来调用。看个例子:

class User:
    """
    注意self总是在括号里的最左边
    """
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def hi(self):
        print("hi!I'm {}".format(self.name))

u=User("li",32)
u.hi()
print(u.name+","+str(u.age))

"""
程序输出:
hi!I'm li
li,32
"""

复制代码

上面的代码里,在User类的__init__方法中self被传入,那么就可以通过self.nameself.age来声明对象的两个字段,并将传入该方法的参数nameage赋值给它们。当我们创建类型为User的对象的时候,传入实际的参数"li"32,这两个参数被python解释器传入__init__方法中,"li"对应name32对应age__init__方法立即被调用,将实例u的字段一一建立。

self.name=name粗看貌似都是name变量,但self.name是实例的字段,专属于实例,name是创建对象时将要传入的一个参数,将它赋值给self.name是没有歧义的。

1.2.实例变量与类变量

事实上,字段除了独属于实例之外,跟普通变量没有什么差别,所以实例的字段也被称为实例变量。在类的定义中,与实例变量对应的还有类变量,类变量与实例变量类似,通过.操作符来访问。类变量是任何实例共享的,可以理解为是该类型所共有的特征,比如,在User类中,我们可以计算一共有多少被实例化了的用户:

class User:
    """
    计算被实例化的用户数量
    """
    count=0

    def __init__(self,name,age):
        """每次创建一个对象,用户数量在原有基础上加1"""
        User.count=User.count+1
        self.name=name
        self.age=age

    def hi(self):
        print("hi!I'm {}".format(self.name))

    def die(self):
        print("I'm {}, dying...".format(self.name))
        User.count=User.count-1
        del self
    
    @classmethod
    def print_count(cls):
        print("共有{}名用户".format(cls.count))


u=User("li",32)
User.print_count()
u.hi()

u1=User("ma",30)
u1.__class__.print_count()
u1.hi()

u.die()
User.print_count()
u1.die()
User.print_count()

"""
程序输出:
共有1名用户
hi!I'm li
共有2名用户
hi!I'm ma
I'm li, dying...
共有1名用户
I'm ma, dying...
共有0名用户
"""

复制代码

上面代码中的count就是类变量,可以通过User.count来访问。python通过@classmethod来表明它下面定义的方法是类的方法(method),类的方法中的cls是类本身,跟self使用方法类似,调用类方法时可以直接忽略。类变量跟类的方法(method)都可以被称为类的成员。除了使用类似User.count这样的方式来访问和使用之外,该类的实例还可以通过__class__属性来访问和使用类成员,比如上面代码中的u1.__class__.print_count()

上面代码中定义的字段跟方法都是公开的,可以通过.操作符访问。但如果属性是以形如__name这样以双下划线为开头的名称,则python会自动将名称换成_classname__name,其中classname就是类的名称,这样,通过an_object.__name是访问不到的。

1.3.继承(inherit)

现实世界里,某一类相似客体的类型被抽象为一个概念(名称),同时又有另一类相似客体的类型被抽象为一个概念(名称),这时候我们可能会发现,这两个概念(名称)之间很相似,于是我们把这两个相似概念再抽象成一个概念(名称),这样的过程可以重复多次。举个例子,我们有幼儿园,同时有小学,这时候我们可以把幼儿园跟小学抽象成学校。那跟现实类似,对象的类型跟类型之间,可以抽象成另一个类型。在文章最开头我们说面向对象编程是自顶而下,这跟一层层向上抽象的过程正好相反,我们会在一开始思考如何创建某个类,然后把这个类作为基类(父类) ,更具体的创建一(几)个新类,这一(几)个新类不仅拥有基类的属性,还会增加自己独有的属性。我们把这样的新类(class)叫做子类,是从基类继承而来的。

从1.2小节的代码例子中,我们创建了一个User(用户)类,假如我们现在需要区分免费用户和付费用户,免费用户跟付费用户都具有nameagehi属性,同时免费用户跟付费用户还具有自己独有的一些属性。如果我们直接分别创建免费用户类跟付费用户类,那么这两个类之间共同的属性就会被定义两次,需要复制粘贴同样的代码,这样的代码质量不高并且不够简洁。相反,我们可以让免费用户跟付费用户都从User类继承下来,这样就可以重用(reuse) User类的代码,并且让代码相对简洁高效一点。还有一个好处就是,当免费用户跟付费用户之间共同的属性有了变化(增减),我们可以直接修改父类User,而不用分别修改,当子类的数量很多时,这种好处会显得非常明显。修改父类之后,各子类的独有属性不会受到影响。

1.2小节的代码例子中,我们对实例的数量进行统计,当子类从User类继承下来后,在子类实例化对象的时候,父类的实例数量在python中默认也会增多,这说明我们可以把子类的实例看做是父类的实例,这被称为多态性(polymorphism)。免费用户类跟付费用户类如何从父类继承,如下:

class User:
    """
    计算被实例化的用户数量
    """
    count=0

    def __init__(self,name,age):
        """每次创建一个对象,用户数量在原有基础上加1"""
        User.count=User.count+1
        self.name=name
        self.age=age

    def hi(self):
        print("hi!I'm {}".format(self.name))

    def die(self):
        print("I'm {}, dying...".format(self.name))
        User.count=User.count-1
        del self
    
    @classmethod
    def print_count(cls):
        print("共有{}名用户".format(cls.count))

class  Free_user(User):
    
    def __init__(self,name,age,number_of_ads):
        User.__init__(self,name,age)
        self.number_of_ads=number_of_ads

    def hi(self):
        User.hi(self)
        print("I'm free_user")

class  Paying_user(User):
    def __init__(self,name,age,plan):
        User.__init__(self,name,age)
        self.plan=plan

    def hi(self):
        print("hi!I'm {},paying_user".format(self.name,))


u=Free_user("li",32,5)
User.print_count()
u.hi()

u1=Paying_user("ma",30,"5$")
User.print_count()
u1.hi()

u.die()
User.print_count()
u1.die()
User.print_count()


"""
程序输出:
共有1名用户
hi!I'm li
I'm free_user
共有2名用户
hi!I'm ma,paying_user
I'm li, dying...
共有1名用户
I'm ma, dying...
共有0名用户
"""

复制代码

上面代码中首先创建了User基类,然后从User类继承下来两个子类:Free_userPaying_user。子类要从某个类继承而来,需要在类名后面跟上括号,在括号中填入基类的名称,形如这样:Free_user(User)

在子类的__init__方法中,通过调用基类的__init__方法把继承自基类的共有字段创建出来,调用的时候将self跟传入的属于基类部分的参数原样传入,上面代码中将传入的nameage原样传入了基类的__init__方法中了。因为我们在子类中定义了__init__方法,所以python不会自动调用基类的__init__方法,而需要我们显式地调用它。如果子类中没有定义__init__方法,则python会在创建子类的实例时自动调用基类的__init__方法。这是为什么呢?我们在子类中对基类的hi方法进行了重写,但对die方法则没有,但是我们通过子类创建的实例能够调用die方法,这说明在调用die方法时子类的实例被看做了父类的实例了,同时在调用hi方法时却都调用了重写的子类中的方法了,这说明,当实例调用一个方法时,会首先在实例化自己的类中寻找对该方法的定义,如果没有,则在该类的父类中寻找,如果父类中还是没有,则会在父类的父类中寻找,这样的过程一直重复,直到再也没有父类了,如果还是没有该方法,那程序就会报错。

最后,从前一小节我们知道,以双下划线为前缀的属性名会被python自动替换成另一个名称,这时候当父类中有个以双下划线为前缀的属性,我们在子类中也有一个相同的属性的时候,由于python自动替换了这两个属性名称,子类中的方法并没有覆盖掉父类中的属性,而只是,子类中的该属性跟父类中的该属性是两个不同的属性。看例子:

#其他一些属性用“,”省略了
>>> class a:
...     def __a_method(self):
...         pass
... 
>>> dir(a())
['__class__', ,,, '_a__a_method']
>>> class b(a):
...    def __a_method(self):
...         pass
... 
>>> dir(b())
['__class__', ,,, '_a__a_method', '_b__a_method']
>>> 

复制代码

可以看到,__a_methoda类的实例中被替换成了_a__a_method,在b类的实例中被替换成了_b__a_method,这跟_a_a_method不同,b类的实例中继承了_a_a_method,同时,还有自己类型的_b_a_method

1.4.类(class),对象(object)与类型(type)之间的关系

看个例子:

>>> list.__base__
<class 'object'>
>>> type(list)
<class 'type'>
>>> class User:
...     pass
... 
>>> User.__base__
<class 'object'>
>>> type(list)
<class 'type'>

复制代码

类的属性__base__可以指明该类是继承自哪个类。从上面的例子可以看到,python中定义内置数据类型的类(class)(以list为例)从object类继承而来,但是其类型(type)是type类,我们自己创建并且没有明确指定从是哪个类继承而来的类(以User为例),跟内置类型一样,从object类继承而来,其类型(type)是type类。如果我们自己创建的,并且从层次更低的类(比如User类)中继承而来,那么该类的__base__(基类)跟type函数所显示的类型是怎么样的呢,接上面的例子:

>>> Free_user.__base__
<class '__main__.User'>
>>> type(Free_user)
<class 'type'>
>>> 

复制代码

可以看到,Free_userUser继承而来,但其类型依然是type,所以所有的类(class)的类型应当都是type,是不是这样呢,object会不会例外呢?type自己呢?它的类型呢?下面的例子验证了它们的类型也是type

>>> type(object)
<class 'type'>
>>> type(type)
<class 'type'>

复制代码

从例子中我们知道了,所有的类(class)的类型都是type类,所以,所有的类(class)都是从type类中实例化出来的实例,甚至type类实例化了自己,所以所有的类包括objecttype都是实例,这说明所有的类都是对象 。为了清晰的指代不同种类的对象,我们把本身是类的对象称为类对象,把从类中实例化而来并且本身不是类的对象成为实例对象,实例对象是层次最低的对象。

我们可以看到object类跟type类是python中抽象层次最高的对象了。那么它们两个的关系如何呢?看例子:

>>> type.__base__
<class 'object'>
>>> print(object.__base__)
None
>>> 

复制代码

可以看到,typeobject继承而来,并且我们已经知道object的类型是type。从例子中可以看到object没有基类,所以如果把类的层层继承想象成一条锁链,那么object将是继承链上的顶点。前面我们提到的对象的一些特殊属性如__init____class__继承自object,而__base__这个特殊属性则只有类对象才有,是在type中定义的。如下:

#其他一些属性用“,”省略了
>>> dir(object)
['__class__', ,,, '__init__', ,,, '__subclasshook__']
>>> dir(type)
['__abstractmethods__', '__base__', '__bases__', ,,, 'mro']
>>> 

复制代码

欢迎浏览我的个人博客,https://diwugebingren.github.io

转载于:https://juejin.im/post/5d0495b3e51d4510617210bb

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在python中创建对象(object) 的相关文章

  • Lighttpd 和 cgi python

    我正在尝试通过 lighttpd 执行一些 python 脚本 但是当我尝试运行它时 我只得到一个要求我下载的空白文件 lighttpd conf server modules mod access mod alias mod access
  • python:查找围绕某个 GPS 位置的圆的 GPS 坐标的优雅方法

    我有一组以十进制表示的 GPS 坐标 并且我正在寻找一种方法来查找每个位置周围半径可变的圆中的坐标 这是一个例子 http green and energy com downloads test circle html我需要什么 这是一个圆
  • 保存为 HDF5 的图像未着色

    我目前正在开发一个将文本文件和 jpg 图像转换为 HDF5 格式的程序 用HDFView 3 0打开 似乎图像仅以灰度保存 hdf h5py File Sample h5 img Image open Image jpg data np
  • 与区域指示符字符类匹配的 python 正则表达式

    我在 Mac 上使用 python 2 7 10 表情符号中的标志由一对表示区域指示符号 https en wikipedia org wiki Regional Indicator Symbol 我想编写一个 python 正则表达式来在
  • 安装了 32 位的 Python,显示为 64 位

    我需要运行 32 位版本的 Python 我认为这就是我在我的机器上运行的 因为这是我下载的安装程序 当我重新运行安装程序时 它会将当前安装的 Python 版本称为 Python 3 5 32 位 然而当我跑步时platform arch
  • 处理 Python 行为测试框架中的异常

    我一直在考虑从鼻子转向行为测试 摩卡 柴等已经宠坏了我 到目前为止一切都很好 但除了以下之外 我似乎无法找出任何测试异常的方法 then It throws a KeyError exception def step impl contex
  • Pandas 日期时间格式

    是否可以用零后缀表示 pd to datetime 似乎零被删除了 print pd to datetime 2000 07 26 14 21 00 00000 format Y m d H M S f 结果是 2000 07 26 14
  • 使用 kivy textinput 的 'input_type' 属性的问题

    您好 我在使用 kivy 的文本输入小部件的 input type 属性时遇到问题 问题是我制作了两个自定义文本输入 其中一个称为 StrText 其中设置了 input type text 然后是第二个文本输入 名为 NumText 其
  • Python zmq SUB 套接字未接收 MQL5 Zmq PUB 套接字

    我正在尝试在 MQL5 中设置一个 PUB 套接字 并在 Python 中设置一个 SUB 套接字来接收消息 我在 MQL5 中有这个 include
  • datetime.datetime.now() 返回旧值

    我正在通过匹配日期查找 python 中的数据存储条目 我想要的是每天选择 今天 的条目 但由于某种原因 当我将代码上传到 gae 服务器时 它只能工作一天 第二天它仍然返回相同的值 例如当我上传代码并在 07 01 2014 执行它时 它
  • 如何在 Python 中解析和比较 ISO 8601 持续时间? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个 Python v2 库 它允许我解析和比较 ISO 8601 持续时间may处于不同单
  • Python beautifulsoup 仅限 1 级文本

    我看过其他 beautifulsoup 得到相同级别类型的问题 看来我的有点不同 这是网站 我正试图拿到右边那张桌子 请注意表的第一行如何展开为该数据的详细细分 我不想要那个数据 我只想要最顶层的数据 您还可以看到其他行也可以展开 但在本例
  • 如何通过索引列表从 dask 数据框中选择数据?

    我想根据索引列表从 dask 数据框中选择行 我怎样才能做到这一点 Example 假设我有以下 dask 数据框 dict A 1 2 3 4 5 6 7 B 2 3 4 5 6 7 8 index x1 a2 x3 c4 x5 y6 x
  • Python3 在 DirectX 游戏中移动鼠标

    我正在尝试构建一个在 DirectX 游戏中执行一些操作的脚本 除了移动鼠标之外 我一切都正常 是否有任何可用的模块可以移动鼠标 适用于 Windows python 3 Thanks I used pynput https pypi or
  • Pandas 将多行列数据帧转换为单行多列数据帧

    我的数据框如下 code df Car measurements Before After amb temp 30 268212 26 627491 engine temp 41 812730 39 254255 engine eff 15
  • Python:XML 内所有标签名称中的字符串替换(将连字符替换为下划线)

    我有一个格式不太好的 XML 标签名称内有连字符 我想用下划线替换它 以便能够与 lxml objectify 一起使用 我想替换所有标签名称 包括嵌套的子标签 示例 XML
  • Django-tables2 列总计

    我正在尝试使用此总结列中的所有值文档 https github com bradleyayers django tables2 blob master docs pages column headers and footers rst 但页
  • 如何计算Python中字典中最常见的前10个值

    我对 python 和一般编程都很陌生 所以请友善 我正在尝试分析包含音乐信息的 csv 文件并返回最常听的前 n 个乐队 从下面的代码中 每听一首歌曲都是一个列表中的字典条目 格式如下 album Exile on Main Street
  • Pandas 每周计算重复值

    我有一个Dataframe包含按周分组的日期和 ID df date id 2022 02 07 1 3 5 4 2022 02 14 2 1 3 2022 02 21 9 10 1 2022 05 16 我想计算每周有多少 id 与上周重
  • 更改 Tk 标签小部件中单个单词的颜色

    我想更改 Tkinter 标签小部件中单个单词的字体颜色 我知道可以使用文本小部件来实现与我想要完成的类似的事情 例如使单词 YELLOW 显示为黄色 self text tag config tag yel fg clr yellow s

随机推荐

  • 在springboot中配置web.xml

    在springBoot中配置web xml中配置的servlet http www cnblogs com wangxiaomei p 8885470 html 转载于 https www cnblogs com lxcmyf p 1006
  • SQL字符串处理函数大全

    select语句中只能使用sql函数对字段进行操作 xff08 链接sql server xff09 xff0c select 字段1 from 表1 where 字段1 IndexOf 34 云 34 61 1 这条语句不对的原因是ind
  • 设计模式之(十五)职责链Chain of Responsibility

    Chain of Responsibility定义 Chain of Responsibility CoR 是用一系列类 classes 试图处理一个请求request 这些类之间是一个松散的耦合 唯一共同点是在他们之间传递request
  • 如何判断一个C++对象是否在堆上

    摘要 在帖子 34 如何判断一个C 43 43 对象是否在堆栈上 中 xff0c 又有人提出如何判断一个C 43 43 对象是否在堆上 阅读全文 Richard Wei 2012 05 12 14 30 发表评论 转载于 https www
  • 前端框架Vue、angular、React的优点和缺点,以及应用场景

    学习web前端开发中 xff0c 会有很多的框架 xff0c 那么目前流行的框架有哪些 xff0c 以及他们的优缺点和应用场景有哪些呢 xff1f 一 Vue js xff1a 其实Vue js不是一个框架 xff0c 因为它只聚焦视图层
  • AFNetworking(二)AFNetworking对form-data请求体的处理

    AFNetworking 发送 GET POST 等请求时可以直接将参数按照字典结构传入 xff0c 最终编码到 url 中或者是 body 实体中 xff0c 同时也支持按照 multipart form data 格式 xff0c 将多
  • Android原生SpeechRecognizer(语音识别)

    开篇先吐槽下 xff0c 在Android 平台开发原生的SpeechRecognizer真是难受的 xff0c 不像ios xff0c 无比轻松 xff0c 平台统一 由于Android 平台的碎片化问题比较严重 xff0c 各个厂商都有
  • shell 读取配置文件

    shell 读取配置文件来取参数的值 在许许多多 自动化 的脚本中 很学用 bin sh filepath 61 34 home test test txt 34 while read LINE do user 61 96 echo LIN
  • MFC 获取本机IP地址(多个网卡)

    szHostName 128 gethostname szHostName hostent pHost i pHost gethostbyname szHostName i pHost pHost h addr list i i CStri
  • python 网站文件及数据库备份脚本

    初学python xff0c 试着写了一份python网站文件备份和数据库备份的脚本 xff0c 功能是写出来了 xff0c 但感觉还是不太适应 xff0c 写得不太好 xff0c 以后还要努力哈 xff01 backup py读取back
  • Qt实现串口通信总结

    Qt实现串口通信总结 注意 xff1a Qt5发布之前 xff0c Qt实现串口通信一般是采用第三方类库qextserialport Qt5发布后自带了QtSerialPort 能够支持串口通信 1 Qextserialport类介绍 在Q
  • 开发中状态到底用数字还是字符串

    做了这么多年网站发现 xff0c 一个遗留下来的习惯是否需要变变 就是在设计数据库及数据结构的时候 xff0c 我们已经习惯了用数字来表示 xff0c 例如 xff1a 0表示正常 xff0c 1表示删除 但是 xff0c 这么设计有几个好
  • org.springframework.expression.spel.SpelEvaluationException: EL1011E: Method call: Attempted to call...

    前言 本文中提到的解决方案 xff0c 源码地址在 xff1a springboot thymeleaf xff0c 希望可以帮你解决问题 至于为什么已经写了一篇文章thymeleaf模板引擎调用java类中的方法 xff0c 又多此一举的
  • (Access denied for user 'root'@'slaver1' (using password: YES))

    1 问题描述 xff0c 启动azkaban的时候报如下所示的错误 之前使用azkaban是root用户 xff0c 今天使用hadoop用户进行配置和使用 xff0c 报这个错 xff0c 说是root连接mysql拒绝了 1 hadoo
  • 【Python实战】用代码来访问1024网站

    1024是一个好网站 首先 xff0c 此次实战系列的前提是您能科学的找到1024网站 xff01 我这里并不提供网站地址 xff0c 特此声明 xff0c 这里只是用计算机科学的态度和方法 xff0c 来分析一个问题 和1024网站没有任
  • js立即执行函数与分组操作符()的用法

    一 圆括号运算符 圆括号运算符也叫分组运算符 xff0c 它有两种用法 xff1a 如果表达式放在圆括号中 xff0c 作用是求值 xff1b 如果跟在函数后面 xff0c 作用是调用函数 把表达式放在圆括号之中 xff0c 将返回表达式的
  • 开开心心做几道JavaScript机试题 - 02

    前集回顾 我们在开开心心做几道JavaScript机试题 01中吐了槽 xff0c 也顺势展开了机试题之旅 xff0c 本章我们暂时压抑自己的吐槽之心 xff0c 继续就题目前行 仍然希望对各位正确认识JavaScript这门语言 xff0
  • 汇总路由的计算方法

    路由汇总的计算 路由汇总计算实例 xff1a 路由表中存储了如下网络 xff1a 172 16 1 0 24 172 16 2 0 24 172 16 3 0 24 172 16 4 0 24 172 16 5 0 24 要计算路由器的汇总
  • Linux 杀死进程方法大全(kill,killall)

    杀死进程最安全的方法 是单纯使用kill命令 xff0c 不加修饰符 xff0c 不带标志 首先使用ps ef命令确定要杀死进程的PID xff0c 然后输入以下命令 xff1a kill pid 注释 xff1a 标准的kill命令通常都
  • 在python中创建对象(object)

    该系列文章 xff1a python入门 xff0c 编程基础概念介绍 xff08 变量 xff0c 条件 xff0c 函数 xff0c 循环 xff09 python中的数据类型 xff08 list xff0c tuple xff0c