深入浅析Python的类
作者:laozhang 发布时间:2021-01-09 08:42:13
面向对象编程时,都会遇到一个概念,类,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.


猜你喜欢
- 一、私有化上篇说过封装,既将我们不想让别人看到代码的内容,但是又需要用到的内容,通过类内部调用来实现调用。说到这里却不得不提一下上篇的:cl
- 有时候我们需要在程序里执行一些cmd命令,使用os或者其它模块中的popen方法去执行这个问题一般是程序内有输入导致的,这个输入可以是inp
- 对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长。特别像报表系统,每天花费在数据导入上的时间可能会长达几个
- 需求描述最近在写一个图像标注小工具,其中需要用到一个缩略图列表,来查看文件夹内的图片文件。这里整理一个基于QListWidget实现的版本,
- 背景:我们有一个用go做的项目,其中用到了zmq4进行通信,一个简单的rpc过程,早期远端是使用一个map去做ip和具体socket的映射。
- strconv包该包主要实现基本数据类型与其字符串表示的转换。常用函数为Atoi()、Itia()、parse系列、format系列、app
- Oracle的out参数实例详解一 概念1、一般来讲,存储过程和存储函数的区别在于存储函数可以有一个返回值;而存储过程没有返回值。2、过程和
- 注意:列转行的方法可能是我独创的了,呵呵,因为在网上找不到哦,全部是我自己写的,用到了系统的SysColumns(一)行转列的方法先说说行转
- 封装是一个将Python数据对象转化为字节流的过程,拆封是封装的逆操作,将字节文件或字节对象中的字节流转化为Python数据对象,不要从不收
- 项目场景:在使用selenium模块进行数据爬取时,通常会遇到爬取iframe中的内容。会因为定位的作用域问题爬取不到数据。问题描述:我们以
- 本文介绍了深入理解ES6的迭代器与生成器,分享给大家,具体如下:循环语句的问题var colors = ["red",
- 查看版本号sqlplus / as sysdba>select * from v$version;备份orcl数据库export OR
- 设置密码保护SqlServer数据库备份文件! 备份SqlServer数据库 Backup Database [数据库] To disk=&
- 1.hashlib密码散列hashlib模块定义了一个API来访问不同的密码散列算法。要使用一个特定的散列算法,可以用适当的构造器函数或ne
- 我就废话不多说了,大家还是直接看代码吧~type Wait interface { // Register waits returns a
- 1.主要用到 QFileDialog 方法打开本地文件2.界面打开前:打开后:3. 代码import sysfrom PyQt5 impor
- 利用Python正则表达式匹配字符串中的http链接。主要难点是用正则表示出http 链接的模式。import repattern = re
- 记得以前写过一篇文章 php有效的过滤html标签,js代码,css样式标签: <?php $str = preg_replace(
- 1、通过requests.get方法r = requests.get("http://200.20.3.20:8080/job/C
- 摘要:本篇博客介绍了本教程的目标、适用人群、YOLOv5简介和车牌识别的意义和应用场景。为后续章节打下基础,帮助读者了解YOLOv5和车牌识