对Python中class和instance以及self的用法详解


Posted in Python onJune 26, 2019

一. Python 的类和实例

在面向对象中,最重要的概念就是类(class)和实例(instance),类是抽象的模板,而实例是根据类创建出来的一个个具体的 “对象”。

就好比,学生是个较为抽象的概念,同时拥有很多属性,可以用一个 Student 类来描述,类中可定义学生的分数、身高等属性,但是没有具体的数值。而实例是类创建的一个个具体的对象, 每一个对象都从类中继承有相同的方法,但是属性值可能不同,如创建一个实例叫 hansry 的学生,其分数为 93,身高为 176,则这个实例拥有具体的数值。

1.类:以Student类为例,在Python中,定义类如下:

class Student(object):
  def __init__(self,name,score):
    self.name=name
    self.score=score

a.(object)表示的是该类从哪个类继承下来的,而object类是每个类都会继承的一个类。 yt

b. __init__ 方法的第一参数永远是 self,用来表示类创建的实例本身,因此,在 __init__ 方法内部,就可以把各种属性绑定到self,因为self 本身就是指向创建的实例本身。

c. 有了 __init__ 方法后,在创建实例的时候,就不能传入空参数,必须传入与 __init__ 方法匹配的参数,但self本身不需要传入参数,只需要传入 self 后面的参数即可。

2.实例: 定义好了类后,就可以通过Student类创建出 Student 的实例,创建实例是通过 类名 + ()实现:

student = Student('name', 93)

>>> student.name
"name"
>>> student.score
93

a. 其中 Student 是类名称,('name',93)为要传入的参数

b. self.name 就是 Student类的属性变量,为 Student 类所有。同时, name 是外部传来的参数,不是 Student 类所自带的。故 self.name = name 的意思就是把外部传来的参数 name 的值赋值给 Student类自己的属性变量 self.name .

3.和普通函数相比,在类中定义函数只有一点不同,就是第一参数永远是类的本身实例变量 self, 并且调用时,不用传递该参数。 除此之外,类的方法(函数)和普通函数没有啥区别。既可以用 默认参数、可变参数或者关键字参数等。

二. 类 以及 实例的访问

1.限制外部对类实例属性的访问

既然 Student 类实例本身就拥有这些属性的数据,那么要访问这些数据,就没必要从外面的函数去访问,而可以在类的内部定义访问数据的函数,这样,就可以把 ”数据“ 封装起来了。这些封装数据的函数和 Student 类本身是相关联的,称之为类的方法:

class Student(obiect):
  def __init__(self, name, score):
    self.name = name
    self.score = score
  def print_score(self):
    print "%s: %d" % (self.name, self.score)
>>> student= Student("hansry",99)
>>> student.print_property()

hansry:99

由此可见,从外部看Student类,我们只知道创建实例需要给出 name 和 score。究竟如何打印,是 Student 类内部定义的,这些数据和逻辑被封装起来了,调用也就变得容易了,但是不知道内部实现的细节。

如果不想让实例中的内部属性被外部属性访问,则把 name 和 score 变成 __name 和 __score 即可,如下代码所示:

class Student(object):

  def __init__(self, name, score):
    self.__name = name
    self.__score = score
  def print_property(self):
    print "%s: %d" %(self.__name,self.__score)
>>> student= Student("hansry",99)
>>> student.print_property()
>>> student.__name()

hansry:99
Traceback (most recent call last):
AttributeError: 'Student' object has no attribute '__name'

2.开 API 使得外部代码能够访问到里面的属性,并且对其进行修改

外部代码访问到类实例属性,代码如下:

def __init__(self,name,score):
    self.__name=name
    self.__score=score
  def print_property(self):
    print("%s:%d"%(self.__name,self.__score))

  def get_name(self):
    return self.__name

  def get_score(self):
    return self.__score
name=student.get_name()
score=student.get_score()
print ("%s,%d" % (name,score))

外部代码修改类里面的实例属性,代码如下:

def __init__(self,name,score):
    self.__name=name
    self.__score=score
  def print_property(self):
    print("%s:%d"%(self.__name,self.__score))

  def reset_name(self,change_name):
    self.__name = change_name

  def reset_score(self, change_score):
    self.__score = change_score
student= Student("hansry",99)
student.print_property()
student.reset_name("simona")
student.reset_score(91)
name=student.get_name()
score=student.get_score()
print ("%s:%d" % (name,score))

hansry:99
simona:91

需要注意的是,在Python中,变量名类似 _xxx_的,也就是双下划线开头,并且以下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是 private 变量,不能用 __name__, __score__ 。

三. self 的仔细用法

1.self代表类的实例,而非类。

class Student(object):
  def print_self(self):
    print(self)
    print(self.__class__)
student=Student()
student.print_self()

<__main__.Student object at 0x7fd9095aed90>
<class '__main__.Student'>

从上面例子可得,self代表的只是类的实例,而 self.__class__ 才是类。

2. 定义类的时候,self最好写上,因为它代表了类的实例。

3. 在继承时,传入的是哪个实例,就是那个传入的实例,而不是指定义了self的类的实例。

class Teacher(object):
  def __init__(self,teacher):
    self.teacher=teacher
    print(self.teacher)

  def print_self(self):
    print(self)

class Student(Teacher):
  def __init__(self,student):
    self.student=student    
    print(self.student)

  def print_self_1(self):
    print(self)
teacher=Teacher("hansry")
student=Student("simona")
student.print_self_1()
student.print_self()

hansry
simona
<__main__.Student object at 0x7fd9095b0950>
<__main__.Student object at 0x7fd9095b0950>

在运行 student.print_self() 的时候,这里是调用了 类 Teacher 的 print_self() 函数,此时虽然调用的是 类Teacher的函数,但是此时的实例 self 确是 类 Student 实例化时生成的。

以上这篇对Python中class和instance以及self的用法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python编程使用tkinter模块实现计算器软件完整代码示例
Nov 29 Python
关于python之字典的嵌套,递归调用方法
Jan 21 Python
Python格式化字符串f-string概览(小结)
Jun 18 Python
python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析
Oct 14 Python
Python使用微信接入图灵机器人过程解析
Nov 04 Python
python matplotlib如何给图中的点加标签
Nov 14 Python
python元组的概念知识点
Nov 19 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
Dec 23 Python
翻转数列python实现,求前n项和,并能输出整个数列的案例
May 03 Python
Python Scrapy多页数据爬取实现过程解析
Jun 12 Python
python 如何调用远程接口
Sep 11 Python
Python获取江苏疫情实时数据及爬虫分析
Aug 02 Python
Python中的支持向量机SVM的使用(附实例代码)
Jun 26 #Python
对python 中class与变量的使用方法详解
Jun 26 #Python
python 机器学习之支持向量机非线性回归SVR模型
Jun 26 #Python
python机器学习库scikit-learn:SVR的基本应用
Jun 26 #Python
Python Numpy 实现交换两行和两列的方法
Jun 26 #Python
python 字典操作提取key,value的方法
Jun 26 #Python
通过PYTHON来实现图像分割详解
Jun 26 #Python
You might like
PHP FOR MYSQL 代码生成助手(根据Mysql里的字段自动生成类文件的)
2011/07/23 PHP
PHP使用pear自带的mail类库发邮件的方法
2015/07/08 PHP
PHP文件操作之获取目录下文件与计算相对路径的方法
2016/01/08 PHP
CI框架封装的常用图像处理方法(缩略图,水印,旋转,上传等)
2016/11/22 PHP
ThinkPHP5.0框架使用build 自动生成模块操作示例
2019/04/11 PHP
javascript写的一个链表实现代码
2009/10/25 Javascript
Javascript学习笔记5 类和对象
2010/01/11 Javascript
为JavaScript添加重载函数的辅助方法
2010/07/04 Javascript
javascript之querySelector和querySelectorAll使用介绍
2011/12/20 Javascript
web的各种前端打印方法之jquery打印插件jqprint实现网页打印
2013/01/09 Javascript
js实现有时间限制消失的图片方法
2015/02/27 Javascript
javascript 实现map集合
2015/04/03 Javascript
基于JS实现新闻列表无缝向上滚动实例代码
2016/01/22 Javascript
jquery实现自适应banner焦点图
2017/02/16 Javascript
jQuery 循环遍历改变a标签的href(实例讲解)
2017/07/12 jQuery
浅谈JS获取元素的N种方法及其动静态讨论
2017/08/25 Javascript
bootstrap时间控件daterangepicker使用方法及各种小bug修复
2017/10/25 Javascript
原生js实现仿window10系统日历效果的实例
2017/10/31 Javascript
浅谈angular4.0中路由传递参数、获取参数最nice的写法
2018/03/12 Javascript
js实现GIF动图分解成多帧图片上传
2019/10/24 Javascript
JS实现随机抽取三人
2019/11/06 Javascript
js实现盒子移动动画效果
2020/08/09 Javascript
Python扩展内置类型详解
2018/03/26 Python
基于tensorflow加载部分层的方法
2018/07/26 Python
django 邮件发送模块smtp使用详解
2019/07/22 Python
Python aiohttp百万并发极限测试实例分析
2019/10/26 Python
纯CSS3实现移动端展开和收起效果的示例代码
2020/04/26 HTML / CSS
详解CSS3实现响应式手风琴效果
2020/06/10 HTML / CSS
迪卡侬英国官网:Decathlon英国
2017/04/08 全球购物
在子网210.27.48.21/30种有多少个可用地址?分别是什么?
2014/07/27 面试题
医科大学毕业生自荐信
2014/02/03 职场文书
《母亲的恩情》教学反思
2014/02/13 职场文书
外贸业务员求职信
2014/06/16 职场文书
创先争优个人承诺书
2014/08/30 职场文书
《乘法分配律》教学反思
2016/02/24 职场文书
python munch库的使用解析
2021/05/25 Python