Python中类、对象与self详解

先介绍一下python中的类与对象/实例。然后详细说明self。说明:对象等同实例,本文称呼不一致时请自行统一

【一】类与对象/实例

1、类

  (1)类由名称、属性、方法三部分组成

  (2)类是抽象模板,比如学生,汽车可以用Student、Car类来表示

  (3)类命名规范:数字、字母、下划线,数字不能开头;要驼峰式命名

  (4)定义类:

    第一种:class 类名:(冒号缩进,代码块内含属性与方法)

    第二种:class 类名(object):(--(Object)表示该类从哪个类继承下来的,Object类是所有类都会继承的类。--)

#子类继承父类
class Parent:def pprt(self):print(self)class Child(Parent):    #表示子类从父类继承def cprt(self):print(self)
c = Child()
c.cprt()        # Child类的实例
c.pprt()        #self指的是Child类的实例,父类Parent中定义了pprt()方法
p = Parent()
p.pprt()    # Parent类的实例

  (5)关于self:类函数需要定义一个‘self’,不用理会不需要赋值;self不是py关键字,但是必填;self可以用其他参数替代,如“this、a”,只是约定俗称

  (6)如下图:p.sayhello() ,实际上Python解释成Person.sayhello(p),也就是说把self替换成类的实例

# 实例说明self代表是是对象/实例本身,而非类本身(类中包含多个对象)
#
self不必非写成self,可以其它参数代替,只是约定俗成,但必须写
class Person:def sayhello(self):print(self)print('***********分割线*************')print('My name is:linda') p=Person() p.sayhello() #等同:Person.sayhello(p)
# 如果我们的定义和调用时均不传类实例是可以的,这就是类方法
class Person:def sayhello():print()print('***********分割线*************')print('My name is:linda')
p=Person()
Person.sayhello()   # 定义和调用均不传类实例 

2、对象/实例

  (1)对象是由类 创建出来的实体,对象也称实例

  (2)对象要从类中继承方法,具有类里面所有属性和方法的使用权限

  (3)创建方式:对象名 = 类()   ---如: tom = Person()

class Person:def sayhello(self):print(self)print('***********分割线*************')print('My name is:linda')
p=Person()

3、__init__方法: ---也叫 初始化方法

    类中定义了__init__方法,则表示在创建对象时系统会默认调用此方法,也叫初始化方法

      由于类起到模板的作用,因此,可以在创建实例的时候,把我们认为必须绑定的属性强制填写进去。这里就用到Python当中的一个内置方法__init__方法,例如在Person类时,把name、age等属性绑上去:

      

 

    说明:

    1、类在创建对象时就已经有默认的属性(如创建一辆汽车时就已经注定这个车子是什么品牌,有几个轮子等),所以类的属性一般定义在__init__方法中

    2、__init__方法在创建对象时候被调用,所以属性通过(对象 = Car(属性))传入方法中

    【注意点】(1)__init__方法的第一参数永远是self,表示self指向创建的类实例本身,因而,在__init__方法内部,可以把各种属性绑定到self,等同于绑定创建的实例本身

         (2)__init__方法 在创建实例时,不可传入空的参数,必须传入与__init__方法匹配的参数,但self不需要传,Python解释器会自己把实例变量传进去

         (3)如上图: self.name = name的意思就是把外部传来的参数name的值赋值给Person类自己的属性变量self.name

                        说明:self就是指类本身,self.name就是Person类的属性变量,是Person类所有。而name是外部传来的参数,不是Person类所自带的。

【二】self的详细说明

1、说明:

  (1)# 实例说明self代表是是对象/实例本身,而非类本身(类中可包含多个对象)

  (2)# self不必非写成self,可以其它参数代替,只是约定俗成,但必须写  

  (3)# 如果我们的定义和调用时均不传类实例也是可以的

    

2、关于类函数/类方法

  【?】类函数与普通函数的区别:

     仅在于类函数:第一参数永远是类的本身实例变量self,调用时,不用传递该参数     

  (1)方法,通俗点来说就是函数; ---把每一项类中所有的功能封装起来称为方法,一般方法里的内容就是方法的执行过程

     方法多具有执行性

     举例: 比如类表示的是People 也就是人 

               人的类中会有一些属性 这些属性大概是 身高、体重、姓名等等

               那么方法比如是 跑、吃、等等

class Person(object):def __init__(self, name, age):self.name = nameself.age = ageprint('我叫{0},我今年{1}岁'.format(self.name,self.age))   #我叫小明,我今年18岁

person=Person("小明",18)
person.name
person.age

      【说明】Person类实例本身拥有一些数据,那么要访问这些数据,就不需要从外面的函数去访问,可直接在Person类的内部定义访问数据的函数(方法),这样,就可以把”数据”封装起来。

          这些封装数据的函数是和Person类本身是关联起来的,称之为类的方法

          我们从外部看Person类,只需要知道,创建实例需要给出name和age。

          而如何打印,都是在Person类的内部定义的,这些数据和逻辑被封装起来了,调用很容易,但却不知道内部实现的细节。

          如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线,在Python中,实例的变量名如果以开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问

          这样就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮

          (注意)Python中,变量名类似__xxx__的,也就是以双下划线开头,且以双下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是private变量,所以,不可以这样命名

          

 

转载于:https://www.cnblogs.com/nbnuan/articles/9805952.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396403.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java开发环境:还在配classpath?你out啦!

2019独角兽企业重金招聘Python工程师标准>>> 先说结论:只需要配置JAVA_HOME和path路径即可,无需配置classpath 参考Oracle官网的说明: The class path tells JDK tools and applications where to find third-party and user-defi…

.Net Core 商城微服务项目系列(二):使用Ocelot + Consul构建具备服务注册和发现功能的网关...

1.服务注册 在上一篇的鉴权和登录服务中分别通过NuGet引用Consul这个包,同时新增AppBuilderExtensions类: public static class AppBuilderExtensions{public static IApplicationBuilder RegisterConsul(this IApplicationBuilder app,IApplicationLife…

四参数坐标转换c++_GPSRTK坐标转换及四参数、七参数适用条件

工程测量仪器已由经纬仪、全站仪过渡到GNSS(全球卫星导航系统),特别是公路行业,GPS-RTK作为GNSS的一种应用目前已十分普及。现阶段GPS-RTK以WGS-84 坐标系统为主流,所发布的星历参数也是基于此坐标系统,但随着北斗导航系统的逐步完…

java hadoop api_Hadoop 系列HDFS的Java API( Java API介绍)

HDFS的Java APIJava API介绍将详细介绍HDFS Java API,一下节再演示更多应用。Java API 官网如上图所示,Java API页面分为了三部分,左上角是包(Packages)窗口,左下角是所有类(All Classes是)窗口,右侧是详情窗口。这里推…

最大连通子数组

这次是求联通子数组的求和,我们想用图的某些算法,比如迪杰斯特拉等,但是遇到了困难。用BFS搜索能达到要求,但是还未能成功。 那么我们这样想,先将每行的最大子数组之和,然后再将这些最大之和组成一个数组&a…

[Matlab] 画图命令

matlab画图命令,不定时更新以便查找 set(gcf, color, [1 1 1]);     % 使图背景为白色 alpha(0.4);           %设置平面透明度 plot(Circle1,Circle2,k--,linewidth,1.25);  % k--设置线型  ‘linewidth’,1.25  设置线宽度为1.25 %线型   …

终端terminal的颜色配置

PS1 color 终端terminal的颜色配置 PS1"\[\e[92;1m\][\u\e[90;5m\e[25m\[\e[91;4m\]Atlas\e[24m\[\e[1m\]\[\e[92;1m\] \W ]\\$\[\e[0m\]" Set CodeDescriptionExamplePreview1Bold/Bright echo -e "Normal \e[1mBold" 2Dim echo -e "Normal \e[2mDi…

Linux Kernel Oops异常分析

0.linux内核异常常用分析方法 异常地址是否在0附近,确认是否是空指针解引用问题异常地址是否在iomem映射区,确认是否是设备访问总线异常问题,如PCI异常导致的地址访问异常异常地址是否在stack附近,如果相邻&#xff0c…

【懒癌发作】收集各种懒癌发作时用程序写作业的程序

updata:20170621 好的,已经是准高一了,现在看起来太蠢了。。。 -------------------------------------------------------------------------------------- 要真正的运用,程序一定是要来解决实际问题的——比如作业(懒就直说&…

50欧姆线设计 高频pcb_硬件设计基础100问(三)

硬件基础知识问答今天依旧是节前知识储备哦,jacky大神整理的硬件基础知识很细致,第三弹学起来!01 1、晶体管基本放大电路有共射、共集、共基三种接法,请简述这三种基本放大电路的特点。共射:共射放大电路具有放大电流和…

java操作文件爱女_Java的IO操作---File类

目标1)掌握File类作用2)可以使用file类中方法对文件进行读写操作。File类唯一与文件有关的类。使用file类可进行创建或删除操作,要想使用File类,首先观察File类的构造方法。public File(String pathname);实例化File类的时候,必须设置好路径。…

openssl创建私有ca

openssl创建私有ca1.ssl大概内容PKI:公钥基础设施结构CA:证书权威机构,PKI的核心CRL:证书吊销列表,使用证书之前需要检测证书有效性证书存储格式常见的X509格式包含内容 公钥有效期限证书的合法拥有人证书该如何使用CA的信息CA签名…

查询显示注释_SQL的简单查询

1.基本的查询语句-- *代表查询所有的列select * from <表名>;distinct表示列中不包括重复的值&#xff0c;例如select distinct 姓名&#xff1b;如果是select distinct 姓名,学号&#xff1b;则表示姓名和学号都重复的值才会显示。as为列设定别名&#xff0c;例如select…

【AC自动机】【数据结构】【树】【Aho-Corasick automation】AC自动机理解(入门)...

引入 我们首先提出一个问题&#xff1a; 给出n个串每个串的长度≤m 然后给出一个长度为k的串&#xff0c;询问前n个串中有多少个是匹配成了的 暴力搜索 这题不是sb题目吗&#xff1f; 随随便便O(kmn)跑过。 。。。。 n10000 m50 k1000000 。。。。 好吧——我们用AC自动…

java 栈空间_初学JAVA——栈空间堆空间的理解

1.Person pangzi; //这是在“开拓空间”于栈空间pangzinew Person(); //这是赋值于堆空间上两步就是在做与空间对应的事。2.值类型直接存入栈空间&#xff0c;如AF&#xff0c;引用类型存入堆空间&#xff0c;在栈空间存有“索引地址”&#xff0c;如当需要B时&#xff0…

jmeter+maven+jenkins自动化接口测试(下)

mavenjmeter已经写好了&#xff0c;可以通过maven来执行jmeter的接口测试脚本&#xff0c;怎样实现定时执行测试并发送报告邮件就需要通过jenkins了&#xff08;jmeter或者testng也可以结合不同的邮件jar包来发送邮件&#xff0c;这里使用jenkins&#xff09; 安装jenkins笔记有…

Android RecyclerView (一) 使用完全解析

转载请标明出处&#xff1a; http://blog.csdn.net/lmj623565791/article/details/45059587&#xff1b; 本文出自:【张鸿洋的博客】 概述 RecyclerView出现已经有一段时间了&#xff0c;相信大家肯定不陌生了&#xff0c;大家可以通过导入support-v7对其进行使用。 据官方的…

Asix下日志包冲突

为什么80%的码农都做不了架构师&#xff1f;>>> Class org.apache.commons.logging.impl.SLF4JLogFactory does not implement org.apache.commons.logging. 最近集成asix包的时候发生如下错误&#xff0c;原因是程序运行时logFactoryImple加载了JBOSS下面的sff4j包…

kubernetes中mysql乱码_在kubernetes中部署tomcat与mysql集群-Go语言中文社区

在kubernetes中部署tomcat与mysql集群之前必须要有以下这些基础&#xff1a;1. 已安装、配置kubernetes2. 集群中有tomcat与mysql容器镜像3. 有docker基础具体步骤部署tomcat创建tomcat RC对象我们想要在kubernetes集群中配置tomcat服务器&#xff0c;首先要保证集群中的节点上…

【原】Jenkins持续集成环境搭建之创建java项目的job【centos6.5 java maven git 项目】...

一、构建一个maven项目在jenkins主页上&#xff0c;左侧&#xff0c;选择“新建”&#xff0c;然后填写项目名称&#xff0c;选择“构建一个maven项目”二、Git配置保存之后&#xff0c;进入详细配置页面&#xff1a;这里的源码管理&#xff1a;选择git&#xff0c;输入代码的g…