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,一经查实,立即删除!

相关文章

面试题28 字符串排列

题目描述 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。 输入描述: 输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。 1 cla…

javascript 框架_克服JavaScript框架疲劳

javascript 框架by Tero Parviainen通过Tero Parviainen 克服JavaScript框架疲劳 (Overcoming JavaScript Framework Fatigue) The JavaScript community is suffering from a wave of framework fatigue. It’s caused by the massive outpouring of new frameworks, techniq…

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…

qpython3可以调用哪些库_Python3 如何使用asyncio库在调用第三方模块(存在IO等待)的情况下实现协程?...

问题描述demo中有一个 task_check 的模块,底层是用urllib实现,请问如果要实现使用 asyncio 库实现协程操作,需要修改这个模块的底层代码吗?如何修改? 往大佬指点问题出现的环境背景及自己尝试过哪些方法平时都是使用 gevent 库和 monkey.patch_all() 实现协程,但发现 gevent …

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

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

java打印数组_Java中打印数组内容的方式有哪些?

下面是几种常见的打印方式。方法一:使用循环打印。public class Demo {public static void main(String[] args) {String[] infos new String[] {"Java", "Android", "C/C", "Kotlin"};StringBuffer strBuffer new Strin…

$(function() {})

$(function() {});是$(document).ready(function(){ })的简写, 最早接触的时候也说$(document).ready(function(){ })这个函数是用来取代页面中的window.onload; 用来在DOM加载完成之后执行一系列预先定义好的函数。

恢复工具

EasyRecovery http://www.upantool.com/hfxf/huifu/2011/EasyRecovery_V6.22.html转载于:https://www.cnblogs.com/cb168/p/5359133.html

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

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

教主的魔法

传送门 这道题序列很长,但是操作数很少,然后也没想到什么好的数据结构来维护,那就分块吧。 感觉维护的过程很好想,修改的时候对于整个块都在内的直接打标记,两个零散的区间暴力重构,重新排序。查询的时候&a…

obs自定义编码设置_通过7个步骤设置OBS进行实时编码

obs自定义编码设置by Wesley McCann韦斯利麦肯(Wesley McCann) 通过7个步骤设置OBS进行实时编码 (Setting up OBS for Live Coding in 7 Steps) Twitch TV is a popular live-streaming service. You traditionally used Twitch to stream yourself playing video games, but …

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…

redis的zset的底层实现_Redis(三)--- Redis的五大数据类型的底层实现

1、简介Redis的五大数据类型也称五大数据对象;前面介绍过6大数据结构,Redis并没有直接使用这些结构来实现键值对数据库,而是使用这些结构构建了一个对象系统redisObject;这个对象系统包含了五大数据对象,字符串对象(st…

科学计算机简单编程_是“计算机科学”还是“编程”?

科学计算机简单编程by Sam Corcos由Sam Corcos 是“计算机科学”还是“编程”? (Is It “Computer Science” or “Programming”?) 教育政策白皮书(提示:它们不是同一个东西) (An education policy white paper (hint: they’re not the same thing))…

[Matlab] 画图命令

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

django入门记录 2

1. 创建一个app, python manage.py startapp appname 2. 设计model,在appname/目录下编辑好model 3. 检测model的修改,python manage.py makemigrations appname 4. 自动执行数据库迁移,并同步管理数据库结构, python…

spark sql 数据类型转换_SparkSql 数据类型转换

1、SparkSql数据类型 1.1数字类型 ByteType:代表一个字节的整数。范围是-128到127 ShortType:代表两个字节的整数。范围是-32768到32767 IntegerType:代表4个字节的整数。范围是-2147483648到2147483647 LongType:代表8个字节的整数。范围是-9223372036854775808到92233720…

【Python】 list dict str

list & dict & str 这三种类型是python中最常用的几种数据类型。他们都是序列的一种 ■  序列通用操作 1. 分片 s[a:b] 返回序列s中从s[a]到s[b-1]的片段。注意s[0:0]是空集而不是s[0] s[a:b:c]  加入第三个参数以设置取样步长。可以设置成负数来从右向左取样 2. 加…

终端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…