在Python中,所有数据类型都可以视为对象,也可以自定义对象。自定义的对象即面向对象中的类(Class)的概念。

  1. class Student(object):
  2.  
  3. def __init__(self, name, score):
  4. self.name = name
  5. self.score = score
  6.  
  7. def print_score(self):
  8. print('%s: %s' % (self.name, self.score))

注意:__init__方法的第一个参数永远是self,表示创建的实例本身。

因此在__init__方法内部,就可以把各种属性绑定到self,因为self就指向创建的实例本身。

如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__。

在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。

所以,我们把Student类改一改:

  1. class Student(object):
  2.  
  3. def __init__(self, name, score):
  4. self.__name = name
  5. self.__score = score
  6.  
  7. def print_score(self):
  8. print('%s: %s' % (self.__name, self.__score))

改完后,对于外部代码来说,没什么变动,但是已经无法从外部访问实例变量.__name和实例变量.__score了:

  1. >>> bart = Student('Bart Simpson', 98)
  2. >>> bart.__name
  3. Traceback (most recent call last):
  4. File "<stdin>", line 1, in <module>
  5. AttributeError: 'Student' object has no attribute '__name'

由于Python是动态语言,根据类创建的实例可以任意绑定属性。给实例绑定属性的方法是通过实例变量,或者通过self变量:

  1. class Student(object):
  2. def __init__(self, name):
  3. self.name = name
  4.  
  5. s = Student('Bob')
  6. s.score = 90
  1. //@property使用方法
  2. class Student(object):
  3.  
  4. def get_score(self):
  5. return self._score
  6.  
  7. def set_score(self, value):
  8. if not isinstance(value, int):
  9. raise ValueError('score must be an integer!')
  10. if value < 0 or value > 100:
  11. raise ValueError('score must between 0 ~ 100!')
  12. self._score = value

现在,对任意的Student实例进行操作,就不能随心所欲地设置score了:

  1. >>> s = Student()
  2. >>> s.set_score(60) # ok!
  3. >>> s.get_score()
  4. 60
  5. >>> s.set_score(9999)
  6. Traceback (most recent call last):
  7. ...
  8. ValueError: score must between 0 ~ 100!

使用后的变化:

  1. class Student(object):
  2. @property
  3. def score(self):
  4. return self._score
  5.  
  6. @score.setter
  7. def score(self, value):
  8. if not isinstance(value, int):
  9. raise ValueError('score must be an integer!')
  10. if value < 0 or value > 100:
  11. raise ValueError('score must between 0 ~ 100!')
  12. self._score = value

@property的实现比较复杂,我们先考察如何使用。

把一个getter方法变成属性,只需要加上@property就可以了。此时@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值。

于是,我们就拥有一个可控的属性操作:

  1. >>> s = Student()
  2. >>> s.score = 60 # OK,实际转化为s.set_score(60)
  3. >>> s.score # OK,实际转化为s.get_score()
  4. 60
  5. >>> s.score = 9999
  6. Traceback (most recent call last):
  7. ...
  8. ValueError: score must between 0 ~ 100!

注意到这个神奇的@property,我们在对实例属性操作的时候,就知道该属性很可能不是直接暴露的,而是通过getter和setter方法来实现的。

python中类的概念的更多相关文章

  1. Python中类的__init__继承

    Python中类的__init__继承 概念: 定义父类 In [10]: class Person: ....: def __init__(self,name,age,sex): ....: sel ...

  2. python中类的继承

    python中类的继承 在python中面向对象编程中实现继承,以下面一个实例进行说明. class SchoolMenber(): # __init__类似于c++中的构造函数 # __init__ ...

  3. 面向对象的编程思想和Java中类的概念与设计

    面向对象的编程思想学习,面向对象内容的三条主线;1.java类及类的对象2.面向对象的三大特征3.其他关键字学习内容:3.1面向对象与面向过程面向对象与面向过程在应用上的区别 Java中类的概念与设计 ...

  4. python中类中属性和方法的具体定义方法和使用

    1. Python中类中特性分成属性和方法 属性和方法都分为私有和公有的,私有的只可以在本类中使用外部是无法访问的 2. 定义属性(成员变量)的语法格式(公有属性/私有属性) class 类名: de ...

  5. Python中类的属性的访问控制

    因为自己是做.NET的,之前有学习过Python,喜欢这门语言的很多特性,最近又不时看了一会儿,将自己的感受分享给大家,其中也难免会用C#的角度看Python的语法,主要还是讲下Python中类中对属 ...

  6. python中类的定义、实例化、封装以及私有变量/方法

    1.  定义类 python中定义一个类的格式如下: class MyClass(object): def __init__(self,data1,data2): self.__data1=data1 ...

  7. Python中类的继承代码实例

    Python中类的继承代码实例 这篇文章主要介绍了Python中类的继承代码实例,本文直接给出代码及运行效果,需要的朋友可以参考下 相对于C 的继承编写,Python更简洁,而且效率也是很高的,下面编 ...

  8. 第7.6节 Python中类的继承机制详述

    在本章第一节,介绍了面向对象程序设计的三个特征:封装.继承和多态,前面章节重点介绍了封装和多态,由于Python语言是多态语言,对象的类型不再由继承等方式决定,而由实际运行时所表现出的具体行为来决定, ...

  9. Python中类的相关介绍

    本文主要介绍python中类的概念性内容,如类的定义.说明及简单使用 1. 类的简单介绍 1 # -*- coding:utf-8 -*- 2 # Author:Wong Du 3 4 ''' 5 - ...

随机推荐

  1. PHP 内置函数fgets读取文件

    php fgets()函数从文件指针中读取一行 语法: fgets(file,length) 参数 描述 file  必需.规定尧要读取的文件 length 可选 .规定尧都区的字节数.默认是102字 ...

  2. _event

      EventId  事件ID 请使用大于100的ID EventName 事件的名称,用于游戏中各种提示 NoticeText  事件开始时的弹窗内容 GossipText  功能宝石等菜单内容 Z ...

  3. Python.错误解决:scrapy 没有crawl 命令

    确保2点: 1.把爬虫.py复制到spiders文件夹里 如执行scrapy crawl demo ,spiders里面就要有demo.py文件 2.在项目文件夹内执行命令 在scrapy.cfg所在 ...

  4. 使用phpmyadmin创建数据库

    1,使用phpmyadmin也需要实现安装php环境,安装环境请参考:http://www.sitestar.cn/bbs/thread-164-1-1.html: 2,到phpmyadmin官方网站 ...

  5. django分页 Paginator

    分页功能是几乎所有的网站上都需要提供的功能,当你要展示的条目比较多时,必须进行分页,不但能减小数据库读取数据压力,也有利于用户浏览. Django又很贴心的为我们提供了一个Paginator分页工具, ...

  6. OpenModelica中simulate的用法

    先把官网上的说明文档放上来: simulate simulates a modelica model by generating c code, build it and run the simula ...

  7. Qt5获取本机网络信息

    获取本机网络信息 在pro文件中加入如下代码 QT += network widget.h中的代码如下 #ifndef WIDGET_H #define WIDGET_H #include <Q ...

  8. H5多媒体(用面向对象的方法控制视频、音频播放、暂停、延时暂停)

    视频,音频播放器会是我们在工作中用到的一些h5新标签,它自带一些属性,比如暂停播放,快进快退,但是,我们经常不用原生的样式或者方法,我们需要自定义这些按钮来达到我们需要的样式,也需要我们自定义来实现一 ...

  9. 在dos输入pybot显示不是内部命令,或者显示chromedriver.exe要加入到path中?

    在dos输入pybot显示不是内部命令,或者显示chromedriver.exe要加入到path中? 一直使用robot framework编写脚本,结果有一天输入 pybot XXXX.robot ...

  10. (转+整理)C#中使用GUID

    GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的所有机器都是唯一的.通常平台会提供生成GUID的API.生成算法很有意思,用到了以太网卡地址.纳秒级时间.芯片ID码和许多可 ...