深入浅析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 相关文章推荐
Python学习笔记(一)(基础入门之环境搭建)
Jun 05 Python
python之yield表达式学习
Sep 02 Python
Python输出带颜色的字符串实例
Oct 10 Python
完美解决安装完tensorflow后pip无法使用的问题
Jun 11 Python
django做form表单的数据验证过程详解
Jul 26 Python
Django文件存储 自己定制存储系统解析
Aug 02 Python
flask实现验证码并验证功能
Dec 05 Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
Dec 27 Python
python如何获取apk的packagename和activity
Jan 10 Python
python-for x in range的用法(注意要点、细节)
May 10 Python
python 管理系统实现mysql交互的示例代码
Dec 06 Python
Python图像处理库PIL详细使用说明
Apr 06 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
桌面中心(二)数据库写入
2006/10/09 PHP
ajax缓存问题解决途径
2006/12/06 PHP
php 需要掌握的东西 不做浮躁的人
2009/12/28 PHP
PHP static局部静态变量和全局静态变量总结
2014/03/02 PHP
微信公众平台开发实现2048游戏的方法
2015/04/15 PHP
php字符串操作常见问题小结
2016/10/11 PHP
PHP使用微信开发模式实现搜索已发送图文及匹配关键字回复的方法
2017/09/13 PHP
laravel批量生成假数据的方法
2019/10/09 PHP
jsp+javascript打造级连菜单的实例代码
2013/06/14 Javascript
JavaScript中string对象
2015/06/12 Javascript
Javascript页面跳转常见实现方式汇总
2015/11/28 Javascript
JQuery的Pager分页器实现代码
2016/05/03 Javascript
设计模式中的facade外观模式在JavaScript开发中的运用
2016/05/18 Javascript
angular+webpack2实战例子
2017/05/23 Javascript
关于ES6箭头函数中的this问题
2018/02/27 Javascript
[01:23:35]Ti4主赛事胜者组 DK vs EG 1
2014/07/19 DOTA
python数据库操作常用功能使用详解(创建表/插入数据/获取数据)
2013/12/06 Python
python操作mysql数据库
2017/03/05 Python
python字符串与url编码的转换实例
2018/05/10 Python
解决Pycharm无法import自己安装的第三方module问题
2018/05/18 Python
对Python通过pypyodbc访问Access数据库的方法详解
2018/10/27 Python
Python3中编码与解码之Unicode与bytes的讲解
2019/02/28 Python
pandas 数据索引与选取的实现方法
2019/06/21 Python
django 做 migrate 时 表已存在的处理方法
2019/08/31 Python
复化梯形求积分实例——用Python进行数值计算
2019/11/20 Python
Python使用py2neo操作图数据库neo4j的方法详解
2020/01/13 Python
Python3爬虫发送请求的知识点实例
2020/07/30 Python
CSS3制作皮卡丘动画壁纸的示例
2020/11/02 HTML / CSS
英国护发和美妆在线商店:Klip Shop
2019/03/24 全球购物
屈臣氏马来西亚官网:Watsons马来西亚
2019/06/15 全球购物
大学生评语大全
2014/04/18 职场文书
解除劳动关系协议书范文
2014/09/11 职场文书
入党积极分子对十八届四中全会期盼的思想汇报
2014/10/17 职场文书
女性健康知识讲座通知
2015/04/23 职场文书
廉洁自律准则学习心得体会
2016/01/13 职场文书
Python实现自动玩连连看的脚本分享
2022/04/04 Python