python 第五天

2021-05-02 04:27

阅读:348

标签:定义   with open   文件的   AMM   多个实例   lse   strong   告诉   转换   

 

一 、类

1.1创建和使用类

类几乎可以模拟任何东西

class Dog():                类的首字母大写,定义中的括号是空的  类中的函数称为方法,先前学到的关于函数的知识也适用
"""一次模拟小狗的简单尝试"""          对函数加以说明
    def __init__(self, name, age):    初始化/initializ。这是特殊方法,每次创建实例都会自动运行。每个与类相关的方法都会自动传递实参self。它是实类本身的应用,让实类可以访问类的属性和方法
        """初始化属性name和age"""       对方法加以说明
        self.name = name              以self为前缀的变量可供类中所有方法使用,还可以通过类的任何实例来访问这些变量。可通过实例访问的变量成为属性
        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) 方法__init__()并未显式地包含return语句,但Python自动返回一个表示这条小狗的实例。将这个实例存储在变量my_dog 中
my_dog.name 访问属性使用句点表示法
my_dog.sit() 使用句点访问法调用类中的任何方法

 

可以根据需要创建多个实例

1.2 使用类和实例

1.2.1 给属性指定默认值

类中的每个属性都必须有初始值,哪怕这个值是0或空字符串。在有些情况下,如设置默认值时,在方法__init__() 内指定这种初始值是可行的;如果你对某个属性这样做

了,就无需包含为它提供初始值的形参。

class Car():
    def __init__(self, make, model, year):
        """初始化描述汽车的属性"""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0        注意这里
    def get_descriptive_name(self):
        --snip--
    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()

1.2.2 修改属性值

直接修改

my_new_car.odometer_reading = 23

通过方法修改属性值

class Car():
    --snip--
    def update_odometer(self, mileage):       与上面相比,这里添加了一个方法,在内部进行更新
        """将里程表读数设置为指定的值"""
        self.odometer_reading = mileage

通过方法对属性的值进行递增

class Car():
    --snip--
    def update_odometer(self, mileage):
        --snip--
    def increment_odometer(self, miles):      这里使用方法来对属性值递增
        """将里程表读数增加指定的量"""
        self.odometer_reading += miles

1.3 继承

编写类时,并非总是要从空白开始。如果你要编写的类是另一个现成类的特殊版本,可使用继承 。

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

class Car():              创建子类时,父类必须包含在当前文件中,且位于子类前面
    """一次模拟汽车的简单尝试"""
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0
    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):
        if mileage >= self.odometer_reading:
            self.odometer_reading = mileage
        else:
            print("You can‘t roll back an odometer!")
        def increment_odometer(self, miles):
            self.odometer_reading += miles

class ElectricCar(Car):    定义子类时,必须在括号内指定父类的方法。方法__init__() 接受创建Car 实例所需的信息
"""电动汽车的独特之处"""
    def __init__(self, make, model, year):
    """初始化父类的属性"""
        super().__init__(make, model, year)   super()是一个特殊函数,将父类和子类关联起来

让一个类继承另一个类后,可在子类中添加区分子类和父类所需的新属性和方法,而父类并不包含

使用继承时,可让子类保留从父类那里继承而来的精华,并剔除不需要的糟粕

对于父类的方法,只要它不符合子类模拟的实物的行为,都可对其进行重写。为此,可在子类中定义一个与要重写的父类方法同名的方法。这样,Python将不会考虑这
个父类方法,而只关注你在子类中定义的相应方法。

将实例用作属性.使用代码模拟实物时,你可能会发现自己给类添加的细节越来越多:属性和方法清单以及文件都越来越长。在这种情况下,可能需要将类的一部分作为一个独立的类提取出来。你可以将大型类拆分成多个协同工作的小类。

class Car():
    --snip--class Battery():
    """一次模拟电动汽车电瓶的简单尝试"""    def __init__(self, battery_size=70):
        """初始化电瓶的属性"""
        self.battery_size = battery_size
    def describe_battery(self):
        """打印一条描述电瓶容量的消息"""
        print("This car has a " + str(self.battery_size) + "-kWh battery.")

class
ElectricCar(Car): """电动汽车的独特之处""" def __init__(self, make, model, year): """初始化父类的属性,再初始化电动汽车特有的属性""" super().__init__(make, model,year)
self.battery = Battery()

1.4 导入类

从模块中导入类

from car import Car

虽然同一个模块中的类之间应存在某种相关性,但可根据需要在一个模块中存储任意数量的类。

可根据需要在程序文件中导入任意数量的类。用逗号分隔

from car import Car, ElectricCar

还可以导入整个模块,再使用句点表示法访问需要的类

import car
my_beetle = car.Car(volkswagen, beetle, 2016)

导入模块中所有类(不推荐)。需要从一个模块中导入很多类时,最好导入整个模块,并使用 module_name.class_name 语法来访问类

from module_name import *

在一个模块中导入另一个模块。有时需要将类分散到多个模块中,以免模块太大,或在同一个模块中存储不相关的类。将类存储在多个模块中时,你可能会发现一个模块中的类依赖于另一个模块中的类

electric_car.py  

"""一组可用于表示电动汽车的类"""
from car import Car
class Battery():
    --snip--
class ElectricCar(Car):
    --snip--

这样,创建实例时

from car import Car
from electric_car import ElectricCar

my_beetle = Car(volkswagen, beetle, 2016)
print(my_beetle.get_descriptive_name())

my_tesla = ElectricCar(tesla, roadster, 2016)
print(my_tesla.get_descriptive_name())

一开始应让代码结构尽可能简单。先尽可能在一个文件中完成所有的工作,确定一切都能正确运行后,再将类移到独立的模块中

1.5 标准库

Python标准库是一组模块,安装的Python都包含它。你现在对类的工作原理已有大致的了解,可以开始使用其他程序员编写好的模块了。可使用标准库中的任何函数和类,为此
只需在程序开头包含一条简单的import 语句

如:模块random 包含以各种方式生成随机数的函数,其中的randint() 返回一个位于指定范围内的整数

from random import randint             生成一个[1,3]范围内的随机数
x = randint(1, 6)

1.6 类编码风格

(1)类名应采用驼峰命名法 ,即将类名中的每个单词的首字母都大写,而不使用下划线。实例名和模块名都采用小写格式,并在单词之间加上下划线。

(2)对于每个类,都应紧跟在类定义后面包含一个文档字符串,简要地描述类的功能,并遵循编写函数的文档字符串时采用的格式约定。每个模块也都应包含一个文
档字符串,对其中的类可用于做什么进行描述。
(3)可使用空行来组织代码,但不要滥用。在类中,可使用一个空行来分隔方法;而在模块中,可使用两个空行来分隔类
(4)需要同时导入标准库中的模块和你编写的模块时,先编写导入标准库模块的import 语句,再添加一个空行,然后编写导入你自己编写的模块的import 语句。在包含多
条import 语句的程序中,这种做法让人更容易明白程序使用的各个模块都来自何方。

注意:方法replace() 将字符串中的特定单词都替换为另一个单词,但是 replace 不会改变原 string 的内容

temp_str = this is a test
print(temp_str.replace(is,IS)
print(temp_str)

>>>thIS IS a test
>>>this is a test

二、文件和异常

2.1从文件中读取数据

2.1.1读取整个文件

with open(pi_digits.txt) as file_object:
    contents = file_object.read()
    print(contents)

关键字with让python自行确定文件关闭的时刻。函数open接受的第一个参数是要打开的文件名,python会在当前执行的文件所在的目录中查找改文件,并返回一个表示文件的对象(即此处的file_object)

这里用方法read() 读取此文件的全部内容,并将其作为一个长字符串存储在变量contents 中。因为read() 到达文件末尾时返回一个空字符串,将这个空字符串显示出来时就是一
个空行。要删除多出来的空行,可在print 语句中使用rstrip()

with open(pi_digits.txt) as file_object:              
    contents = file_object.read()
    print(contents.rstrip())            Python方法rstrip()删除字符串末尾的空白。

2.1.2文件路径

相对路径:相对文件路径让Python到指定的位置去查找,而该位置是相对于当前运行的程序所在目录的

with open(text_files\filename.txt) as file_object:

绝对路径:将文件在计算机中的准确位置告诉Python,不用关心当前运行的程序存储在什么地方

file_path = ‘C:\Users\ehmatthes\other_files\text_files\filename.txt‘
with open(file_path) as file_object:

通过使用绝对路径,可读取系统任何地方的文件。就目前而言,最简单的做法是,要么将数据文件存储在程序文件所在的目录,要么将其存储在程序文件所在目录下的一个文件
夹中

2.1.3逐行读取

可采用for循环

filename = pi_digits.txt
with open(filename) as file_object:
    for line in file_object:
        print(line.rstrip())

2.1.4 创建一个包含文件各行内容的列表

使用关键字with 时,open() 返回的文件对象只在with 代码块内可用。

如果要在with 代码块外访问文件的内容,可在with 代码块内将文件的各行存储在一个列表中,并在with 代码块外使用该列表

filename = pi_digits.txt
with open(filename) as file_object:
    lines = file_object.readlines()    方法readlines()从文件中读取每一行,并将其存储在一个列表中
for line in lines:
    print(line.rstrip())    

2.1.5使用文件内容

将文件读取到内存中后,就可以以任何方式使用这些数据了。

读取文本文件时,Python将其中的所有文本都解读为字符串。如果你读取的是数字,并要将其作为数值使用,就必须使用函数int() 将其转换为整数,或使用
函数float() 将其转换为浮点数。

filename = pi_digits.txt
with open(filename) as file_object:
    lines = file_object.readlines()
pi_string = ‘‘
for line in lines:
    pi_string += line.rstrip()

print(pi_string)
print(len(pi_string))

2.2写入文件

2.2.1 写入空文件

要将文本写入文件,你在调用open() 时需要提供另一个实参,告诉Python你要写入打开的文件

filename = programming.txt
with open(filename, w) as file_object:
    file_object.write("I love programming.")

调用open() 时提供了两个实参,第一个实参也是要打开的文件的名称;第二个实参(‘w‘ )告诉Python,我们要以写入模式打开这个文件。

打开文件时,可指定读取模式 (‘r‘ )、写入模式 (‘w‘ )、附加模式 (‘a‘ )或让你能够读取和写入文件的模式(‘r+‘ )。如果你省略了模式实参,Python将以默认的只读模式打
开文件。

如果你要写入的文件不存在,函数open() 将自动创建它。

需要注意的是,Python只能将字符串写入文本文件。要将数值数据存储到文本文件中,必须先使用函数str() 将其转换为字符串格式。

2.2.2写入多行

要让每个字符串都单独占一行,需要在write() 语句中包含换行符。还可以使用空格、制表符和空行来设置这些输出的格式。

filename = programming.txt
with open(filename, w) as file_object:
    file_object.write("I love programming.\n")
    file_object.write("I love creating new games.\n")

2.2.3附加到文件

如果你要给文件添加内容,而不是覆盖原有的内容,可以附加模式 打开文件。你以附加模式打开文件时,Python不会在返回文件对象前清空文件,而你写入到文件的行都将添加
到文件末尾。如果指定的文件不存在,Python将为你创建一个空文件。

filename = programming.txt
with open(filename, a) as file_object:
    file_object.write("I also love finding meaning in large datasets.\n")
    file_object.write("I love creating apps that can run in a browser.\n")

 

 

参考:python编程:从入门到实践

python 第五天

标签:定义   with open   文件的   AMM   多个实例   lse   strong   告诉   转换   

原文地址:https://www.cnblogs.com/zxpsyneuroscience/p/13202167.html


评论


亲,登录后才可以留言!