深入浅析Python的类


Posted in Python onJune 22, 2018

面向对象编程时,都会遇到一个概念,类,python也有这个概念,下面我们通过代码来深入了解下。

创建和使用类

class Dog():
  def __init__(self, name, age):
    self.name = name
    self.age = age
  def sit(self):
    print(self.name.title() + " is now sitting.")
  def roll_over(self):
    print(self.name.title() + " rolled over!")
 
my_dog = Dog('willie', 6)
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")
 
运行结果:
My dog's name is Willie.
My dog is 6 years old.

class关键字:来定义一个类。类名通常首字母为大写。

__init__方法:特殊方法,每当实例类的时候都会运行。其中的形参self必不可少,而且必须位于最前面。

self形参:类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候

用不为这个参数赋值,Python会提供这个值。这个特别的变量指对象本身。

实例的方法是指定类名以及需要传入的实参。

要访问实例的属性或者调用方法,可使用句点表示法。

使用类和实例

class Car():
  def __init__(self, make, model, year):
    self.make = make
    self.model = model
    self.year = year
    self.odometer_reading = 0 #<- here
 
  def get_descriptive_name(self):
    long_name = str(self.year) + ' ' + self.make + ' ' + self.model
    return long_name.title()
 
  def read_odometer(self):
    print("This car has " + str(self.odometer_reading) + " miles on it.")
 
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer()
 
运行结果:
2016 Audi A4

可以看到,我们给Car类的属性指定了默认值self.odometer_reading = 0。如果要修改它,我们可以通过实例直接访问它并修改,比如:my_new_car.odometer_reading = 23。或者通过方法修改属性的值。或者通过方法对属性的值进行递增。

class Car():
  --snip--
  #通过方法修改属性的值
  def update_odometer(self, mileage):
    self.odometer_reading = mileage
 
  #通过方法对属性的值进行递增
  def increment_odometer(self, miles):
    self.odometer_reading += miles

继承

一个类继承另一个类时,他将自动获得另一个类的所有属性和方法;原有的类称为父类,新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。

现在我们有一个Car类如下

class Car():
  def __init__(self, make, model, year):
    self.make = make
    self.model = model
    self.year = year
    self.odometer_reading = 0 #<- here
 
  def get_descriptive_name(self):
    long_name = str(self.year) + ' ' + self.make + ' ' + self.model
    return long_name.title()
 
  def read_odometer(self):
    print("This car has " + str(self.odometer_reading) + " miles on it.")
 
  def update_odometer(self, mileage):
    self.odometer_reading = mileage
 
  def increment_odometer(self, miles):
    self.odometer_reading += miles

创建子类实例时,python首先给父类所有属性赋值。

接下来我们创建新类EleCar

class Car():
  --snip--
 
class ElectricCar(Car):
  def __init__(self, make, model, year):
    super().__init__(make, model, year)
 
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
 
运行结果:
2016 Tesla Model S

首先父类必须位于子类前面。

super()是一个特殊函数,将父类和子类关联起来。使得可调用子类的父类的方法__init__(),让子类包父类的所有属性。

给子类定义属性和方法没有任何限制,比如:

class Car():
  --snip--
 
class ElectricCar(Car):
  def __init__(self, make, model, year):
    super().__init__(make, model, year)
    self.battery_size = 70
 
  def describe_battery(self):
    print("This car has a " + str(self.battery_size) + "-kWh battery.")
 
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()
 
运行结果:
2016 Tesla Model S
This car has a 70-kWh battery.

如果需要重写父类的方法,只需定义一个与重写的父类方法同名的方法即可。

python还可以使用其他类的实例作为自己类的属性。

导入类

类似函数,类也可以保存为.py文件形成模块从而进行导入。

导入单个类:

from model_name import class_name

导入一个模块的多个类:

from model_name import class_name1, class_name2

导入一个模块所有类:

from model_name import *

导入整个模块:

import model_name

还可以在一个模块中导入另一个模块

python标准库

其是一组模块。模块collections中有一个类OrderedDict。字典的键值对没有顺序,但是这个类几乎和字典相同,区别只在于记录了键值对的顺序。

from collections import OrderedDict
 
favorite_languages = OrderedDict()
 
favorite_languages['jen'] = 'python'
favorite_languages['sarah'] = 'c'
favorite_languages['edward'] = 'ruby'
favorite_languages['phil'] = 'python'
 
for name, language in favorite_languages.items():
  print(name.title() + "'s favorite language is " +
language.title() + ".")
 
运行结果:
Jen's favorite language is Python.
Sarah's favorite language is C.
Edward's favorite language is Ruby.
Phil's favorite language is Python.
Python 相关文章推荐
用virtualenv建立多个Python独立虚拟开发环境
Jul 06 Python
对matplotlib改变colorbar位置和方向的方法详解
Dec 13 Python
python实现求特征选择的信息增益
Dec 18 Python
python 模拟创建seafile 目录操作示例
Sep 26 Python
Python 中 -m 的典型用法、原理解析与发展演变
Nov 11 Python
python接口自动化如何封装获取常量的类
Dec 24 Python
Python中实现输入超时及如何通过变量获取变量名
Jan 18 Python
Python selenium自动化测试模型图解
Apr 15 Python
keras-siamese用自己的数据集实现详解
Jun 10 Python
python能自学吗
Jun 18 Python
python学习之panda数据分析核心支持库
May 07 Python
Python利用Turtle绘制哆啦A梦和小猪佩奇
Apr 04 Python
基于python绘制科赫雪花
Jun 22 #Python
python3读取csv和xlsx文件的实例
Jun 22 #Python
django admin 后台实现三级联动的示例代码
Jun 22 #Python
python使用turtle库与random库绘制雪花
Jun 22 #Python
Python3导入CSV文件的实例(跟Python2有些许的不同)
Jun 22 #Python
Django Admin实现三级联动的示例代码(省市区)
Jun 22 #Python
详解python中的json和字典dict
Jun 22 #Python
You might like
php数组的一些常见操作汇总
2011/07/17 PHP
php求一个网段开始与结束IP地址的方法
2015/07/09 PHP
利用PHP fsockopen 模拟POST/GET传送数据的方法
2015/09/22 PHP
thinkPHP使用post方式查询时分页失效的解决方法
2015/12/09 PHP
CI配置多数据库访问的方法
2016/03/28 PHP
getAsDataURL在Firefox7.0下无法预览本地图片的解决方法
2013/11/15 Javascript
jquery常用特效方法使用示例
2014/04/25 Javascript
JavaScript截断字符串的方法
2015/07/15 Javascript
Angularjs注入拦截器实现Loading效果
2015/12/28 Javascript
node+experss实现爬取电影天堂爬虫
2016/11/20 Javascript
AngularJS的ng-repeat指令与scope继承关系实例详解
2017/01/21 Javascript
小程序如何使用分包加载的实现方法
2019/05/22 Javascript
VueCli3.0中集成MockApi的方法示例
2019/07/05 Javascript
解决Layui数据表格的宽高问题
2019/09/28 Javascript
JavaScript如何处理移动端拍摄图片旋转问题
2019/11/16 Javascript
python thread 并发且顺序运行示例
2009/04/09 Python
python实现域名系统(DNS)正向查询的方法
2016/04/19 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
2018/03/15 Python
在win10和linux上分别安装Python虚拟环境的方法步骤
2019/05/09 Python
简单了解python的一些位运算技巧
2019/07/13 Python
Atom Python 配置Python3 解释器的方法
2019/08/28 Python
如何基于python实现归一化处理
2020/01/20 Python
tensorflow -gpu安装方法(不用自己装cuda,cdnn)
2020/01/20 Python
Expedia意大利旅游网站:酒店、机票和租车预订
2017/10/30 全球购物
Opodo英国旅游网站:预订廉价航班、酒店和汽车租赁
2018/07/14 全球购物
大学生的创业计划书就该这么写
2014/01/30 职场文书
优秀教师工作感言
2014/02/16 职场文书
酒店开业策划方案
2014/06/02 职场文书
11.9消防日宣传标语
2014/10/08 职场文书
2014年建筑工程工作总结
2014/12/03 职场文书
篮球赛闭幕式主持词
2015/07/03 职场文书
100句人生哲理语录集锦:强者征服今天,懒汉坐等明天
2019/10/18 职场文书
python 提取html文本的方法
2021/05/20 Python
python正则表达式re.search()的基本使用教程
2021/05/21 Python
opencv用VS2013调试时用Image Watch插件查看图片
2021/07/26 Python
如何Python使用re模块实现okenizer
2022/04/30 Python