[零基础学python]编写类之一创建实例

Python中类创建和实例化过程 定义一个类时,使用声明或者默认的元类对该类进行创建,对元类求type运算,得到父元类(该类声明的元类的父元类),调用父元类的__call__函数,在父元类的__call__函数中, 调用该类声明的元类的__new__函数来创建对象(该函数需要返回一个对象(指类)实例),然后再调用该元类的__init__初始化该对象(此处对象是指类,因为是元类创建的对象),最终返回该类。=type, 定义类时就是创建类,此时会调用元类的__call__,如果元类有继承,子元类定义时执行的是父元类的__call__。 阅读详情

虽然已经对类有了一点点模糊概念,但是,阅读前面一讲的内容的确感到累呀,都是文字,连代码都没有。

本讲就要简单多了,尝试走一个类的流程。

说明:关于类的这部分,我参考了《Learning Python》一书的讲解。

创建类

创建类的方法比较简单,如下:

class Person:

注意,类的名称一般用大写字母开头,这是惯例。当然,如果故意不遵循此惯例,也未尝不可,但是,会给别人阅读乃至于自己以后阅读带来麻烦。既然大家都是靠右走的,你就别非要在路中间睡觉了。

接下来,一般都要编写构造函数,在写这个函数之前,先解释一下什么是构造函数。

class Person:
    def __init__(self, name, lang, website):
        self.name = name
        self.lang = lang
        self.website = website

上面的类中,首先呈现出来的是一个名为:__init__()的函数,注意,这个函数是以两个下划线开始,然后是init,最后以两个下划线结束。这是一个函数,就跟我们此前学习过的函数一样的函数。但是,这个函数又有点奇特,它的命名是用“__”开始和结束。

请看官在这里要明确一个基本概念,类就是一种对象类型,和跟前面学习过的数值、字符串、列表等等类型一样。比如这里构建的类名字叫做Person,那么就是我们要试图建立一种对象类型,这种类型被称之为Person,就如同有一种对象类型是list一样。

在构建Person类的时候,首先要做的就是对这种类型进行初始化,也就是要说明这种类型的基本结构,一旦这个类型的对象被调用了,第一件事情就是要运行这个类型的基本结构,也就是类Person的基本结构。就好比我们每个人,在头脑中都有关于“人”这样一个对象类型(对应着类),一旦遇到张三(张三是一个具体人),我们首先运行“人”这个类的基本结构:一个鼻子两只眼,鼻子下面一张嘴。如果张三符合这个基本机构,我们不会感到惊诧(不报错),如果张三不符合这个基本结构(比如三只眼睛),我们就会感到惊诧(报错了)。

由于类是我们自己构造的,那么基本结构也是我们自己手动构造的。在类中,基本结构是写在__init__()这个函数里面。故这个函数称为构造函数,担负着对类进行初始化的任务。

还是回到Person这个类,如果按照上面的代码,写好了,是不是__init__()就运行起来了呢?不是!这时候还没有看到张三呢,必须看到张三才能运行。所谓看到张三,看到张三这样一个具体的实实在在的人,此动作,在python中有一个术语,叫做实例化。当类Person实例化后立刻运行__init__()函数。

#!/usr/bin/env python
#coding:utf-8

class Person:
    def __init__(self, name, lang, website):
        self.name = name
        self.lang = lang
        self.website = website

info = Person("qiwsir","python","qiwsir.github.io")     #实例化Person
print "info.name=",info.name
print "info.lang=",info.lang
print "info.website=",info.website

#上面代码的运行结果:

info.name= qiwsir
info.lang= python
info.website= qiwsir.github.io

在上面的代码中,建立的类Person,构造函数申明了这个类的基本结构:name,lang,website。

注意观察:info=Person("qiwsir","python","qiwsir.github.io"),这句话就是将类Person实例化了。也就是在内存中创建了一个对象,这个对象的类型是Person类型,这个Person类型是什么样子的呢?就是__init__()所构造的那样。在实例化时,必须通过参数传入具体的数据:name="qiwsir",lang="python",website="qiwsir.github.io"。这样在内存中就存在了一个对象,这个对象的类型是Person,然后通过赋值语句,与变量info建立引用关系。请看官回忆以前已经讲述过的变量和对象的引用关系。

看官是不是有点晕乎了?类、实例,这两个概念会一直伴随着后续的学习,并且,在很多的OOP模型中,都会遇到这两个概念。为了让看官不晕乎,这里将它们进行比较(注意:比较的内容,参考了《Learning Python》一书)

类和实例

  • “类提供默认行为,是实例的工厂”,我觉得这句原话非常经典,一下道破了类和实例的关系。看上面代码,体会一下,是不是这个理?所谓工厂,就是可以用同一个模子做出很多具体的产品。类就是那个模子,实例就是具体的产品。所以,实例是程序处理的实际对象。
  • 类是由一些语句组成,但是实例,是通过调用类生成,每次调用一个类,就得到这个类的新的实例。
  • 对于类的:class Person,class是一个可执行的语句。如果执行,就得到了一个类对象,并且将这个类对象赋值给对象名(比如Person)。

也许上述比较还不足以让看官理解类和实例,没关系,继续学习,在前进中排除疑惑。

self的作用

细心的看官可能注意到了,在构造函数中,第一个参数是self,但是在实例化的时候,似乎没有这个参数什么事儿,那么self是干什么的呢?

self是一个很神奇的参数。

在Person实例化的过程中,数据"qiwsir","python","qiwsir.github.io"通过构造函数(__init__())的参数已经存入到内存中,并且这些数据以Person类型的面貌存在组成一个对象,这个对象和变量info建立的引用关系。这个过程也可说成这些数据附加到一个实例上。这样就能够以:object.attribute的形式,在程序中任何地方调用某个数据,例如上面的程序中以info.name得到"qiwsir"这个数据。这种调用方式,在类和实例中经常使用,点号“.”后面的称之为类或者实例的属性。

这是在程序中,并且是在类的外面。如果在类的里面,想在某个地方使用传入的数据,怎么办?

随着学习的深入,看官会发现,在类内部,我们会写很多不同功能的函数,这些函数在类里面有另外一个名称,曰:方法。那么,通过类的构造函数中的参数传入的这些数据也想在各个方法中被使用,就需要在类中长久保存并能随时调用这些数据。为了解决这个问题,在类中,所有传入的数据都赋给一个变量,通常这个变量的名字是self。注意,这是习惯,而且是共识,所以,看官不要另外取别的名字了。

在构造函数中的第一个参数self,就是起到了这个作用——接收实例化过程中传入的所有数据,这些数据是通过构造函数后面的参数导入的。显然,self应该就是一个实例(准确说法是应用实例),因为它所对应的就是具体数据。

如果将上面的类增加两句,看看效果:

#!/usr/bin/env python
#coding:utf-8

class Person:
    def __init__(self, name, lang, website):
        self.name = name
        self.lang = lang
        self.website = website

        print self          #打印,看看什么结果
        print type(self)

#运行结果
<__main__.Person instance at 0xb74a45cc>
<type 'instance'>

证实了推理。self就是一个实例(准确说是实例的引用变量)。

self这个实例跟前面说的那个info所引用的实例对象一样,也有属性。那么,接下来就规定其属性和属性对应的数据。上面代码中:self.name = name,就是规定了self实例的一个属性,这个属性的名字也叫做name,这个属性的数据等于构造函数的参数name所导入的数据。注意,self.name中的name和构造函数的参数name没有任何关系,它们两个一样,只不过是一种起巧合(经常巧合),或者说是写代码的人懒惰,不想另外取名字而已,无他。当然,如果写成self.xxxooo = name,也是可以的。

其实,从效果的角度来理解,可能更简单一些,那就是类的实例info对应着self,info通过self导入实例属性的所有数据。

当然,self的属性数据,也不一定非得是由参数传入的,也可以在构造函数中自己设定。比如:

#!/usr/bin/env python
#coding:utf-8

class Person:
    def __init__(self, name, lang, website):
        self.name = name
        self.lang = lang
        self.website = website
        self.email = "qiwsir@gmail.com"     #这个属性不是通过参数传入的

info = Person("qiwsir","python","qiwsir.github.io")
print "info.name=",info.name
print "info.lang=",info.lang
print "info.website=",info.website
print "info.email=",info.email      #info通过self建立实例,并导入实例属性数据

#运行结果

info.name= qiwsir
info.lang= python
info.website= qiwsir.github.io
info.email= qiwsir@gmail.com    #打印结果

通过这个例子,其实让我们拓展了对self的认识,也就是它不仅仅是为了在类内部传递参数导入的数据,还能在构造函数中,通过self.attribute的方式,规定self实例对象的属性,这个属性也是类实例化对象的属性,即做为类通过构造函数初始化后所具有的属性。所以在实例info中,通过info.email同样能够得到该属性的数据。在这里,就可以把self形象地理解为“内外兼修”了。或者按照前面所提到的,将info和self对应起来,self主内,info主外。

其实,self的话题还没有结束,后面的方法中还会出现它。它真的神奇呀。

构造函数的参数

前面已经说过了,构造函数__init__就是一个函数,只不过长相有点古怪罢了。那么,函数中的操作在构造函数中依然可行。比如:

def __init__(self,*args):
    pass

这种类型的参数:*args和前面讲述函数参数一样,就不多说了。忘了的看官,请去复习。但是,self这个参数是必须的,因为它要来建立实例对象。

很多时候,并不是每次都要从外面传入数据,有时候会把构造函数的某些参数设置默认值,如果没有新的数据传入,就应用这些默认值。比如:

class Person:
    def __init__(self, name, lang="golang", website="www.google.com"):
        self.name = name
        self.lang = lang
        self.website = website
        self.email = "qiwsir@gmail.com"

laoqi = Person("LaoQi")     #导入一个数据name="LaoQi",其它默认值
info = Person("qiwsir",lang="python",website="qiwsir.github.io")    #全部重新导入数据

print "laoqi.name=",laoqi.name
print "info.name=",info.name
print "-------"
print "laoqi.lang=",laoqi.lang
print "info.lang=",info.lang
print "-------"
print "laoqi.website=",laoqi.website
print "info.website=",info.website

#运行结果

laoqi.name= LaoQi
info.name= qiwsir
-------
laoqi.lang= golang
info.lang= python
-------
laoqi.website= www.google.com
info.website= qiwsir.github.io

在这段代码中,看官首先要体会一下,“类是实例的工厂”这句话的含义,通过类Person生成了两个实例:laoqi、info

此外,在看函数赋值的情况,允许设置默认参数值。

至此,仅仅是初步构建了一个类的基本结构,完成了类的初始化。

【Python进阶】3-1 类和实例 | 定义类并创建实例 / 创建实例属性 / 初始化实例属性 文章目录1、定义类并创建实例2、创建实例属性3、初始化实例属性 1、定义类并创建实例 在Python中,类通过 class 关键字定义。以 Person 为例,定义一个Person类如下: class Person(object): pass 按照 Python 的编程习惯,类名以大写字母开头,紧接着是(object),表示该类是从哪个类继承下来的。类的继承将在后面的章节讲解,现在我... 阅读详情

相关推荐

天地图Api4.0.怎么根据geojson的数据。把一个省的所有市区标记色块和文字

天地图

肖肖肖丽珠的博客 1513

CF1450 C1. Errich-Tac-Toe (Easy Version) C2. Errich-Tac-Toe (Hard Version)(构造)

链接 https://codeforces.com/contest/1450/problem/C2 The only difference between the easy and hard versions is that tokens of type O do not appear in the input of the easy version. Errichto gave Monogon the following challenge in order to intimidate him from

萧瑟的博客 6万+

Advanced Installer打包避坑指南:如何正确配置64位系统下的Java环境与注册表条件(以15.7版本为例)

本文详细解析了使用Advanced Installer 15.7版本在64位系统下打包Java应用时的常见问题与解决方案。重点介绍了注册表重定向机制、Java环境检测的双保险策略、环境变量设置的隐藏坑以及权限管理的进阶技巧,帮助开发者避免安装包在用户机器上无法运行的幽灵问题。

weixin_28676289的博客 324

Codeforces Global Round 12 C2. Errich-Tac-Toe (Hard Version)(思维)

题目描述 The only difference between the easy and hard versions is that tokens of type O do not appear in the input of the easy version. Errichto gave Monogon the following challenge in order to intimidate him from taking his top contributor spot on Codeforce

li_wen_zhuo的博客 12万+

使用ST-LINK烧录stm32教程说明

使用ST-LINK烧录stm32

qq_34426854的博客 1万+

细胞膜电学特性的分数阶微积分建模

分数阶微积分在细胞膜电学特性建模中的应用主要体现在对细胞膜的电容行为和神经元放电活动的更精确描述上。

冰河世纪20的博客 623

【Java】被围绕的区域(DFS)

题目描述 给定一个二维的矩阵,包含 'X' 和 'O'(字母 O)。 找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。 示例: X X X X X O O X X X O X X O X X 运行你的函数后,矩阵变为: X X X X X X X X X X X X X O X X 解题思路 DFS+递归寻找和边界联通的'O',其他的'O‘都...

ssjdoudou的博客 1万+

AI 编程新范式:一文彻底搞懂 LLM、Agent、MCP、Skill 是怎么协作的

本文用通俗易懂的方式解析了AI编程新架构的核心概念。通过"三国演义"类比,文章将复杂的技术架构拆解为:Agent(军师/大脑)负责思考和决策,Skill(招式/手脚)执行具体操作,MCP(令箭/协议)作为通信标准,MCP Server(将军/身体)承载多个Skill。这套分工架构使AI从单纯聊天进化成能完成实际编程任务的全能助手,实现了关注点分离——Agent专注智能提升,Skill专注功能实现,MCP确保稳定连接。这正是Cursor、Claude等新一代AI开发工具采用的核心架构,标志

猫老板的豆 3083

xxxooo

namespace xxoo { class ooxx { } } An h1 header Paragraphs are separated by a blank line. 2nd paragraph. Italic, bold, monospace. Itemized lists look like: this one that one the other one Note th...

weixin_30391339的博客 2万+

五.EtherCAT开发之STM32F407ZGt6+ LAN9253 外置EEPROM配置数据含义

EtherCAT从站简称ESC,ESC在上电过程中,会自动加载EEPROM中前7个字(1word = 2 byte)到ESC寄存器。ESC寄存器总是可以被EtherCAT主站通过EtherCAT总线访问,无论PDI接口寄存器配置什么值。EEPROM存储器中的前7个字,将决定ESC的工作模式。

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 3468

数学建模学习(78):多输入多输出回归预测模型(结合XGBoost实现)

多输入多输出回归预测问题求解

全栈川川 8131

python 类的使用

**# 创建实例 **说明:**关于类的这部分,我参考了《Learning Python》一书的讲解。 创建类 创建类的方法比较简单,如下: class Person: 注意,类的名称一般用大写字母开头,这是惯例。 接下来,一般都要编写构造函数,在写这个函数之前,先解释一下什么是构造函数。 class Person: def init(self, name, lang, website): sel...

hiekay的博客 2万+

RAP 语义键:让 UUID 世界变得可读、可导航、可校验

RAP 语义键的核心价值与实现要点 语义键(Semantic Key)是 ABAP RAP 模型中连接技术实现与业务体验的关键设计:通过为实体指定一组业务可读的标识字段(如订单号、物料编码等),在保持技术主键(如UUID)不变的同时,显著提升用户界面的可读性和导航体验。 主要优势: 提升UI可读性:Fiori元素会突出显示语义键字段,帮助用户快速识别关键业务数据 改善导航体验:OData URL会使用可读的语义键而非技术ID,便于分享和排查问题 降低沟通成本:业务人员能准确引用有意义的业务标识而非技术ID

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 156

python中编完类后到实例编写_[零基础学python]编写类之一创建实例

虽然已经对类有了一点点模糊概念,但是,阅读前面一讲的内容的确感到累呀,都是文字,连代码都没有。本讲就要简单多了,尝试走一个类的流程。说明:关于类的这部分,我参考了《Learning Python》一书的讲解。创建类创建类的方法比较简单,如下:class Person:注意,类的名称一般用大写字母开头,这是惯例。当然,如果故意不遵循此惯例,也未尝不可,但是,会给别人阅读乃至于自己以后阅读带来麻烦。既...

weixin_39685130的博客 121

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

python编写person类_[零基础学python]编写类之二方法

上一讲中创建了类,并且重点讲述了构造函数以及类实例,特别是对那个self,描述了不少。在讲述构造函数的时候特别提到,init()是一个函数,只不过在类中有一点特殊的作用罢了,每个类,首先要运行它,它规定了类的基本结构。数据流转过程除了在类中可以写这种函数之外,在类中还可以写别的函数,延续上一讲的例子:#!/usr/bin/env python#coding:utf-8class Person:de...

weixin_34467704的博客 1483

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Python定义类、创建类的对象(类的实例化)

定义类 语法格式 在python中,可以通过class关键字定义类,然后通过定义的类来创建实例对象。语法格式如下: calss 类名: 类体 注意事项 在python中使用class关键字来定义类,定义类时需要注意以下几个事项: (1)类代码块以class关键字开头,代表定义类。 (2)class之后是类名,这个名字由用户自己指定,命名规则一般是多个单词组成的名称,每个单词除了第一个字母大写之外,其余字母均为小写,class和类名中间要有空格。 (3)类名后加冒号,类体由缩进的语句块组成,

m0_53977675的博客 1万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Python创建类

介绍了面向对象的基本术语(适合新人)。还介绍了Python__init__()类构造方法,如何添加\删除变量以及动态添加类的方法等。

不想随波逐流的大学生一枚,我们每个人都在努力奔跑 1万+

python脚本用类编写_跟老齐学Python之编写类之一创建实例

说明:关于类的这部分,我参考了《Learning Python》一书的讲解。创建类创建类的方法比较简单,如下:复制代码 代码如下:class Person:注意,类的名称一般用大写字母开头,这是惯例。当然,如果故意不遵循此惯例,也未尝不可,但是,会给别人阅读乃至于自己以后阅读带来麻烦。既然大家都是靠右走的,你就别非要在路中间睡觉了。接下来,一般都要编写构造函数,在写这个函数之前,先解释一下什么是构...

weixin_39760206的博客 186

python创建学生类和教师类_零基础学Python—类

关于面向对象的语言,Python也是其中一员,尽管它仅仅只是一门解释性语言,但这并不妨碍它使用类。C语言是一门完完全全的面向过程的语言,但是这并不意味着C语言不能够实现面向对象语言的特性,曾经我就干过这事,并且为此去修改了一个不开源的编译器。作为一个用了二十几年C的老程序员,对C语言我有着无与伦比的特殊情感。不仅仅是因为使用的时间长,而是C语言确实是可以达到最高的运行效率,并且有着最好的能效,而C...

weixin_39580564的博客 1072

python中编完类后到实例编写_跟老齐学Python之编写类之一创建实例

说明:关于类的这部分,我参考了《Learning Python》一书的讲解。创建类创建类的方法比较简单,如下:代码如下:class Person:注意,类的名称一般用大写字母开头,这是惯例。当然,如果故意不遵循此惯例,也未尝不可,但是,会给别人阅读乃至于自己以后阅读带来麻烦。既然大家都是靠右走的,你就别非要在路中间睡觉了。接下来,一般都要编写构造函数,在写这个函数之前,先解释一下什么是构造函数。代...

weixin_39922642的博客 99

零基础入门学Python(十一)—— 类和对象

1. 简单介绍一下对象2. 对象 = 属性 + 方法3. 面向对象编程3.1 self是什么3.2 Python的魔法方法3.3 公有和私有4. 继承4.1 调用未绑定的父类方法4.2 使用super函数5. 多重继承6. 组合7. 类、类对象和实例对象8. 到底什么是绑定   需要学习的基础知识有:对象、继承、组合、类、类对象、实例对象、绑定等。 1. 简单介绍一下对象   我们之前已经听说过封装的概念,把乱七八糟的数据扔进列表里边,是数据层面的封装;把常用的代码段打包成一个函数,是语句层面的封装;对象.

大彤小忆的博客 1975

Python之定义类并创建实例(一)

在Python中,类通过 class 关键字定义。以 Person 为例,定义一个Person类如下: class Person(object): pass 类名以大写字母开头(如Person)并且如果有两个单词组成的类名,第二个单词的首字母也应该大写(如StudentHomework)。紧接着是(object),表示该类是从哪个类继承下来的。 class Person(obje...

zhf的博客 5969

python 类,子类,类创建实例,Python类练习

python 类,子类,类创建实例,Python类练习 class Car(): ‘’‘汽车模拟’’’ def init(self,make,model,year): self.make= make self.model= model self.year=year self.odometer_reading= 100 def miaoshu(self): long_name = str(self....

kanxingxingdemao的博客 1432

python创建类并实例化_Python中类的创建和实例化操作示例

本文实例讲述了Python中类的创建和实例化操作。分享给大家供大家参考,具体如下:python中同样使用关键字class创建一个类,类名称第一个字母大写,可以带括号也可以不带括号;python中实例化类不需要使用关键字new(也没有这个关键字),类的实例化类似函数调用方式;# coding: utf-8# 创建一个类,类名称第一个字母大写,可以带括号也可以不带括号class Student():s...

weixin_39708636的博客 850

系统学习Python——类(class)代码的编写基础与实例:类生成多个实例对象

从最底层来看,类基本上就是命名空间,这点很像Python的模块。但是类和模块不同的是,类还支持生成多个对象、命名空间继承以及运算符重载。

冯·诺依曼 1万+
上一篇: [设计模式][装饰模式][Javascript]
下一篇: 【再发福利】ReplaceGoogleCDN:将 Google CDN 替换为国内的 Chrome 插件
mapleandkw
博客等级 码龄17年 8粉丝 100原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值