Python基本之类_玖富娱乐主管发布


玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。

一、择要

面向工具编程 是最有效的软件编写要领之一。在面向工具编程中,你编写透露表现实际天下中的事物和情况的类,并基于这些类来建立工具。编写类时,你界说一大类工具都有的通用行动。基于类建立工具 时,每一个工具都自动具有这类通用行动,然后可依据须要给予每一个工具奇特的特性。运用面向工具编程可模仿实际情况,其真切水平达到了令你惊奇的田地。依据类来建立工具被称为实例化 ,这让你可以或许运用类的实例。

二、建立和运用类

运用类险些可以或许模仿任何器械。

下面来编写一个透露表现小狗的简朴类Dog ——它透露表现的不是特定的小狗,而是任何小狗。关于大多数宠物狗,我们都晓得些甚么呢?它们都有名字和岁数;我们还晓得,大多数小狗还会蹲下和打滚。由于大多数小狗都具有上述两项信息(名字和岁数)和两种行动(蹲下和打滚),我们的Dog 类将包罗它们。这个类让Python晓得怎样建立透露表现小狗的工具。编写这个类后,我们将运用它来建立透露表现特定小狗的实例。

class Dog():
    """一次模仿小狗的简朴实验"""
    def __init__(self, name, age):
        """初始化属性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!")

__init__() 是一个特别的要领,每当你依据Dog 类建立新实例时,Python都邑自动运转它。在这个要领的称号中,开首和末端各有两个下划线,这是一种商定,旨在制止Python默许要领与一般要领发作称号争执

我们将要领__init__() 界说成了包罗三个形参:self 、name 和age 。在这个要领的界说中,形参self 必不可少,还必需位于其他形参的前面。为什么必需在要领界说中包罗形参self 呢?由于Python挪用这个__init__() 要领来建立Dog 实例时,将自动传入实参self 。每一个与类相联系关系的要领挪用都自动通报实参self ,它是一个指向实例自身的援用,让实例可以或许接见类中的属性和要领。我们建立Dog 实例时,Python将挪用Dog 类的要领__init__() 

我们将经由历程实参向Dog() 通报名字和岁数;self 会自动通报,因而我们不须要通报它。每当我们依据Dog 类建立实例时,都只需给末了两个形参(name 和age )供应值

处界说的两个变量都有前缀self 。以self 为前缀的变量都可供类中的统统要领运用,我们还可以或许经由历程类的任何实例来接见这些变量。self.name = name 猎取存储在形参name 中的值,并将其存储到变量name 中,然后该变量被联系关系到以后建立的实例。self.age = age 的作用与此相似。像如许可经由历程实例接见的变量称为属性 

Dog 类还界说了别的两个要领:sit() 和roll_over(),由于这些要领不须要分外的信息,如名字或岁数,因而它们只需一个形参self 。我们背面将建立的实例可以或许接见这些要领,换句话说,它们都邑蹲下和打滚。以后,sit() 和roll_over() 所做的有限,它们只是打印一条音讯,指出小狗正蹲下或打滚。但可以或许扩大这些要领以模仿实际情况:若是这个类包罗在一个计算机游戏中,这些要领将包罗建立小狗蹲下和打滚动画效果的代码。若是这个类是用于掌握机械狗的,这些要领将指导机械狗做出蹲下和打滚的行动

依据类建立实例:

class Dog():
    --snip--

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.")

我们让Python建立一条名字为'willie' 、岁数为6 的小狗。碰到这行代码时,Python运用实参'willie' 和6 挪用Dog 类中的要领__init__() 。要领__init__() 建立一个透露表现特定小狗的示例,并运用我们供应的值来设置属性name 和age 。要领__init__() 并未显式地包罗return 语句,但Python自动返回一个透露表现这条小狗的实例。我们将这个实例存储在变量my_dog 中。在这里,定名商定很有效:我们一般可以或许以为首字母大写的称号(如Dog )指的是类,而小写的称号(如my_dog )指的是依据类建立的实例

接见属性:

要接见实例的属性,可运用句点透露表现法,以下代码来接见my_dog 的属性name 的值:

my_dog.name

句点透露表现法在Python中很常常使用,这类语法演示了Python怎样得悉属性的值。在这里,Python先找到实例my_dog ,再查找与这个实例相联系关系的属性name 。在Dog 类中援用这个属性时,运用的是self.name 。我们运用一样的要领来猎取属性age 的值。在前面的第1条print 语句中,my_dog.name.title() 将my_dog 的属性name 的值'willie' 改成首字母大写的;在第2条print 语句中,str(my_dog.age) 将my_dog 的属性age 的值6 转换为字符串。输出是有关my_dog 的择要:

My dog's name is Willie.
My dog is 6 years old.

挪用要领:

依据Dog 类建立实例后,就可以或许运用句点透露表现法来挪用Dog 类中界说的任何要领

class Dog():
    --snip--

my_dog = Dog('willie', 6)
my_dog.sit()
my_dog.roll_over()

要挪用要领,可指定实例的称号(这里是my_dog )和要挪用的要领,并用句点分开它们。碰到代码my_dog.sit() 时,Python在类Dog 中查找要领sit() 并运转其代码。Python以一样的体式格局解读代码my_dog.roll_over()

Willie is now sitting.
Willie rolled over!

在定名上,若是给属性和要领指定了适宜的形貌性称号,如name 、age 、sit() 和roll_over() ,即使是从未见过的代码块,我们也可以或许轻松地推断出它是做甚么的

建立多个实例:

class Dog():
    --snip--

my_dog = Dog('willie', 6)
your_dog = Dog('lucy', 3)

print("My dog's name is "   my_dog.name.title()   ".")
print("My dog is "   str(my_dog.age)   " years old.")
my_dog.sit()

print("nYour dog's name is "   your_dog.name.title()   ".")
print("Your dog is "   str(your_dog.age)   " years old.")
your_dog.sit()

就算我们给第二条小狗指定一样的名字和岁数,Python依旧会依据Dog 类建立另一个实例。你可按需求依据一个类建立恣意数目的实例,前提是将每一个实例都存储在分歧的变量中,或占用列表或字典的分歧地位。

三、运用类和实例

你可以或许运用类来模仿实际天下中的许多情况。类编写好后,你的大部分时候都将花在运用依据类建立的实例上。你须要实行的一个重要任务是修正实例的属性。你可以或许直接修正实例的属性,也可以或许编写要领以特定的体式格局举行修正。

class Car():
    """一次模仿汽车的简朴实验"""
    def __init__(self, make, model, year):
    """初始化形貌汽车的属性"""
        self.make = make
        self.model = model
        self.year = year

    def get_descriptive_name(self):
    """返回整齐的形貌性信息"""
        long_name = str(self.year)   ' '   self.make   ' '   self.model
        return long_name.title()

my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())

界说了要领__init__() 。与前面的Dog 类中一样,这个要领的第一个形参为self ;我们还在这个要领中包罗了别的三个形参:make 、model 和year 。要领__init__() 接收这些形参的值,并将它们存储在依据这个类建立的实例的属性中。建立新的Car 实例时,我们须要指定其制造商、型号和消费年份

界说了一个名为get_descriptive_name() 的要领,它运用属性year 、make 和model 建立一个对汽车举行形貌的字符串,让我们无需离别打印每一个属性的值。为在这个要领中接见属性的值,我们运用了self.make 、self.model 和self.year 。

我们依据Car 类建立了一个实例,并将其存储到变量my_new_car中。接下来,我们挪用要领get_descriptive_name() ,指出我们拥有的是一辆甚么样的汽车:

2016 Audi A4

给属性指定默许值:

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()

当Python挪用要领__init__() 来建立新实例时,将像前一个示例一样以属性的体式格局存储制造商、型号和消费年份。接下来,Python将建立一个名为odometer_reading 的属性,并将其初始值设置为0。

我们还界说了一个名为read_odometer() 的要领,它让你可以或许轻松地得悉汽车的里程。一最先汽车的里程为0:

2016 Audi A4
This car has 0 miles on it.

修正属性的值:

可以或许以三种分歧的体式格局修正属性的值:直接经由历程实例举行修正;经由历程要领举行设置;经由历程要领举行递增(增添特定的值)

直接修正属性的值:

class Car():
    --snip--
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())

my_new_car.odometer_reading = 23
my_new_car.read_odometer()

我们运用句点透露表现法来直接接见并设置汽车的属性odometer_reading 。这行代码让Python在实例my_new_car 中找到属性odometer_reading ,并将该属性的值设置为23:

2016 Audi A4
This car has 23 miles on it.

经由历程要领修正属性的值:

若是有替你更新属性的要领,将大有裨益。如许,你就无需直接接见属性,而可将值通报给一个要领,由它在内部举行更新

class Car():
    --snip--
    def update_odometer(self, mileage):
    """将里程表读数设置为指定的值"""
        self.odometer_reading = mileage

my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.update_odometer(23)
my_new_car.read_odometer()

增加了要领update_odometer() 。这个要领接收一个里程值,并将其存储到self.odometer_reading 中。

我们挪用了update_odometer() ,并向它供应了实参23(该实参对应于要领界说中的形参mileage)。它将里程表读数设置为23;而要领read_odometer() 打印该读数:

2016 Audi A4
This car has 23 miles on it.

 再看一个例子:

class Car():
    --snip--
    def update_odometer(self, mileage):
        """
        将里程表读数设置为指定的值
        制止将里程表读数往回调
        """
        if mileage >= self.odometer_reading:
            self.odometer_reading = mileage
        else:
            print("You can't roll back an odometer!")

update_odometer() 在修正属性前搜检指定的读数是不是公道。若是新指定的里程(mileage )大于或即是本来的里程(self.odometer_reading ),就将里程表读数改成新指定的里程

不然就发出正告,指出不能将里程表往回拨

经由历程要领对属性的值举行递增:

class Car():
    --snip--
    def update_odometer(self, mileage):
        --snip--
    def increment_odometer(self, miles):
        """将里程表读数增添指定的量"""
        self.odometer_reading  = miles

my_used_car = Car('subaru', 'outback', 2013)
print(my_used_car.get_descriptive_name())

my_used_car.update_odometer(23500)
my_used_car.read_odometer()

my_used_car.increment_odometer(100)
my_used_car.read_odometer()

新增的要领increment_odometer() 接收一个单元为英里的数字,并将其到场到self.odometer_reading 中。

我们建立了一辆二手车my_used_car,挪用要领update_odometer() 并传入23500 ,将这辆二手车的里程表读数设置为23 500。

我们挪用increment_odometer()并传入100 ,以增添从购买到挂号时期行驶的100英里:

2013 Subaru Outback
This car has 23500 miles on it.
This car has 23600 miles on it.

你可以或许轻松地修正这个要领,以制止增量为负值,从而防备有人利用它往返拨里程表。

注重:你可以或许运用相似于上面的要领来掌握用户修正属性值(如里程表读数)的体式格局,但可以或许接见递次的人都可以或许经由历程直接接见属性来将里程表修正成任何值。要确保安全,除举行相似于前面的基础搜检外,还需特别注重细节。

四、继续

编写类时,并不是老是要从空缺最先。若是你要编写的类是另一个现成类的特别版本,可运用继续 。一个类继续 另一个类时,它将自动取得另一个类的统统属性和要领;原有的类称为父类 ,而新类称为子类 。子类继续了其父类的统统属性和要领,同时还可以或许界说本身的属性和要领。

子类的要领__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):
        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):
    """电动汽车的奇特的地方"""
    def __init__(self, make, model, year):
        """初始化父类的属性"""
        super().__init__(make, model, year)

my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())

起首是Car 类的代码。建立子类时,父类必需包罗在以后文件中,且位于子类前面

界说了子类ElectricCar 。界说子类时,必需在括号内指定父类的称号。要领__init__() 接收建立Car 实例所需的信息

super() 是一个特别函数,资助Python将父类和子类联系关系起来。这行代码让Python挪用ElectricCar 的父类的要领__init__() ,让ElectricCar 实例包罗父类的统统属性。父类也称为超类 (superclass),称号super因而而得名

为测试继续是不是可以或许准确地发挥作用,我们实验建立一辆电动汽车ElectricCar 类的一个实例,但供应的信息与建立一般汽车时雷同,并将其存储在变量my_tesla 中。这行代码挪用ElectricCar 类中界说的要领__init__() ,后者让Python挪用父类Car 中界说的要领__init__() 。我们供应了实参'tesla' 、'models' 和2016 

除要领__init__() 外,电动汽车没有其他特有的属性和要领。以后,我们只想确认电动汽车具有一般汽车的行动:

-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。-
2016 Tesla Model S

给子类界说属性和要领:

class Car():
    --snip--
class ElectricCar(Car):
    """Represent aspects of a car, specific to electric vehicles."""
    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()

增加了新属性self.battery_size ,并设置其初始值(如70 )。依据ElectricCar 类建立的统统实例都将包罗这个属性,但统统Car 实例都不包罗它。

增加了一个名为describe_battery() 的要领,它打印有关电瓶的信息。我们挪用这个要领时,将看到一条电动汽车特有的形貌:

2016 Tesla Model S
This car has a 70-kWh battery.

关于ElectricCar 类的特别化水平没有任何限定。模仿电动汽车时,你可以或许依据所需的准确水平增加恣意数目的属性和要领。若是一个属性或要领是任何汽车都有的,而不是电动汽车特有的,就应将其到场到Car 类而不是ElectricCar 类中。如许,运用Car 类的人将取得响应的功用,而ElectricCar 类只包罗处置惩罚电动汽车特有属性和行动的代码

重写父类的要领:

关于父类的要领,只需它不相符子类模仿的什物的行动,都可对其举行重写。为此,可在子类中界说一个如许的要领,即它与要重写的父类要领同名。如许,Python将不会斟酌这个父类要领,而只存眷你在子类中界说的响应要领。假定Car 类有一个名为fill_gas_tank() 的要领,它对全电动汽车来讲毫无意义,因而你能够想重写它。下面演示了一种重写体式格局:

def ElectricCar(Car):
    --snip--
    def fill_gas_tank():
        """电动汽车没有油箱"""
        print("This car doesn't need a gas tank!")

如今,若是有人对电动汽车挪用要领fill_gas_tank() ,Python将疏忽Car 类中的要领fill_gas_tank() ,转而运转上述代码。运用继续时,可以让子类保存从父类那边继续而来的英华,并剔除不须要的糟粕。

将实例用作属性:

运用代码模仿什物时,你能够会发明本身给类增加的细节愈来愈多:属性和要领清单和文件都愈来愈长。在这类情况下,能够须要将类的一部分作为一个自力的类提取出来。你可以或许将大型类拆分红多个协同事情的小类。

比方,赓续给ElectricCar 类增加细节时,我们能够会发明个中包罗许多特地针对汽车电瓶的属性和要领。在这类情况下,我们可将这些属性和要领提取出来,放到另一个名为Battery 的类中,并将一个Battery 实例用作ElectricCar 类的一个属性:

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()

my_tesla = ElectricCar('tesla', 'model s', 2016)

print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()

界说了一个名为Battery 的新类,它没有继续任何类,__init__() 除self 外,另有另一个形参battery_size 。这个形参是可选的:若是没有给它供应值,电瓶容量将被设置为70。要领describe_battery() 也移到了这个类中

在ElectricCar 类中,我们增加了一个名为self.battery 的属性,这行代码让Python建立一个新的Battery 实例(由于没有指定尺寸,因而为默许值70 ),并将该实例存储在属性self.battery 中。每当要领__init__() 被挪用时,都将实行该操纵;因而如今每一个ElectricCar 实例都包罗一个自动建立的Battery 实例。

我们建立一辆电动汽车,并将其存储在变量my_tesla 中。要形貌电瓶时,须要运用电动汽车的属性battery :

my_tesla.battery.describe_battery()

这行代码让Python在实例my_tesla 中查找属性battery ,并对存储在该属性中的Battery 实例挪用要领describe_battery() 

实行效果为:

2016 Tesla Model S
This car has a 70-kWh battery.

这看似做了许多分外的事情,但如今我们想多细致地形貌电瓶都可以或许,且不会致使ElectricCar 类杂沓不胜。下面再给Battery 类增加一个要领,它依据电瓶容量申报汽车的续航里程:

class Car():
    --snip--
class Battery():
    --snip--
    def get_range(self):
    """打印一条音讯,指出电瓶的续航里程"""
        if self.battery_size == 70:
            range = 240
        elif self.battery_size == 85:
            range = 270
        message = "This car can go approximately "   str(range)
        message  = " miles on a full charge."
        print(message)
class ElectricCar(Car):
    --snip--

my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()

新增的要领get_range() 做了一些简朴的剖析:若是电瓶的容量为70kWh,它就将续航里程设置为240英里;若是容量为85kWh,就将续航里程设置为270英里,然后申报这个值。为运用这个要领,我们也经由历程汽车的属性battery 来挪用它

输出指出了汽车的续航里程(这取决于电瓶的容量):

实行效果为:

2016 Tesla Model S
This car has a 70-kWh battery.
This car can go approximately 240 miles on a full charge.

模仿较庞杂的物件(如电动汽车)时,须要处理一些风趣的题目。续航里程是电瓶的属性照样汽车的属性呢?若是我们只需形貌一辆汽车,那末将要领get_range() 放在Battery 类中或许是适宜的;但若是要形貌一家汽车制造商的全部产品线,或许应当将要领get_range() 移到ElectricCar 类中。在这类情况下,get_range() 依旧依据电瓶容量来肯定续航里程,但申报的是一款汽车的续航里程。我们也可以或许如许做:将要领get_range() 还留在Battery 类中,但向它通报一个参数,如car_model ;在这类情况下,要领get_range() 将依据电瓶容量和汽车型号申报续航里程。这让你进入了递次员的另一个境地:处理上述题目时,你从较高的逻辑层面(而不是语法层面)斟酌;你斟酌的不是Python,而是怎样运用代码来透露表实际物。抵达这类境地后,你常常会发明,实际天下的建模要领并没有对错之分。有些要领的效力更高,但要找出效力最高的透露表现法,须要经由肯定的实践。只需代码像你愿望的那样运转,就申明你做得很好!即使你发明本身不能不屡次实验运用分歧的要领来重写类,也没须要泄气;要编写出高效、准确的代码,都得经由如许的历程。

五、导入类

跟着你赓续地给类增加功用,文件能够变得很长,即使你妥帖地运用了继续亦云云。为遵照Python的整体理念,应让文件尽量整齐。为在这方面供应资助,Python许可你将类存储在模块中,然后在主递次中导入所需的模块。

建立car.py文件,并写入以下代码:

"""一个可用于透露表现汽车的类"""
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

文件的开首,包罗了一个模块级文档字符串,对该模块的内容做了扼要的形貌。你应为本身建立的每一个模块都编写文档字符串。

from car import Car

my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.odometer_reading = 23
my_new_car.read_odometer()

import 语句让Python翻开模块car ,并导入个中的Car 类。如许我们就可以或许运用Car 类了,就像它是在这个文件中界说的一样。输出与我们在前面看到的一样:

实行效果为:

2016 Audi A4
This car has 23 miles on it.

虽然同一个模块中的类之间应存在某种相关性,但可依据须要在一个模块中存储恣意数目的类。类Battery 和ElectricCar 都可资助模仿汽车,因而下面将它们都到场模块car.py中:

"""一组用于透露表现燃油汽车和电动汽车的类"""
class Car():
    --snip--

class Battery():
    """一次模仿电动汽车电瓶的简朴实验"""
    def __init__(self, battery_size=60):
        """初始化电瓶的属性"""
        self.battery_size = battery_size

    def describe_battery(self):
        """打印一条形貌电瓶容量的音讯"""
        print("This car has a "   str(self.battery_size)   "-kWh battery.")

    def get_range(self):
        """打印一条形貌电瓶续航里程的音讯"""
        if self.battery_size == 70:
            range = 240
        elif self.battery_size == 85:
            range = 270
        message = "This car can go approximately "   str(range)
        message  = " miles on a full charge."
        print(message)

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

我们就可以或许import ElectricCar类了

from car import ElectricCar

my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()

实行效果为:

2016 Tesla Model S
This car has a 70-kWh battery.
This car can go approximately 240 miles on a full charge.

可依据须要在递次文件中导入恣意数目的类。若是我们要在同一个递次中建立一般汽车和电动汽车,就须要将Car 和ElectricCar 类都导入:

from car import Car, 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())

实行效果为:

2016 Volkswagen Beetle
2016 Tesla Roadster

六、导入全部模块

你还可以或许导入全部模块,再运用句点透露表现法接见须要的类。这类导入要领很简朴,代码也易于浏览。由于建立类实例的代码都包罗模块名,因而不会与以后文件运用的任何称号发作争执。

import car

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

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

导入了全部car 模块。接下来,运用语法 module_name.class_name 接见须要的类。

导入模块中的统统类:

from module_name import *

不引荐运用这类导入体式格局,其缘由有二。起首,若是只需看一下文件开首的import 语句,就可以清楚地晓得递次运用了哪些类,将大有裨益;但这类导入体式格局没有明确地指出你运用了模块中的哪些类。这类导入体式格局还能够激发称号方面的疑心。若是你不小心导入了一个与递次文件中其他器械同名的类,将激发难以诊断的毛病。这里之所以引见这类导入体式格局,是由于虽然不引荐运用这类体式格局,但你能够会在他人编写的代码中见到它。须要从一个模块中导入许多类时,最好导入全部模块,并运用 module_name.class_name 语法来接见类。如许做时,虽然文件开首并没有列出用到的统统类,但你清楚地晓得在递次的哪些地方运用了导入的模块;你还制止了导入模块中的每一个类能够激发的称号争执。

在一个模块中导入另一个模块:

有时候,须要将类疏散到多个模块中,以避免模块太大,或在同一个模块中存储不相关的类。将类存储在多个模块中时,你能够会发明一个模块中的类依赖于另一个模块中的类。在这类情况下,可在前一个模块中导入须要的类。比方,下面将Car 类存储在一个模块中,并将ElectricCar 和Battery 类存储在另一个模块中。我们将第二个模块定名为electric_car.py 

car.py

"""A class that can be used to represent a car."""

class Car():
    """A simple attempt to represent a car."""

    def __init__(self, manufacturer, model, year):
        """Initialize attributes to describe a car."""
        self.manufacturer = manufacturer
        self.model = model
        self.year = year
        self.odometer_reading = 0
        
    def get_descriptive_name(self):
        """Return a neatly formatted descriptive name."""
        long_name = str(self.year)   ' '   self.manufacturer   ' '   self.model
        return long_name.title()
    
    def read_odometer(self):
        """Print a statement showing the car's mileage."""
        print("This car has "   str(self.odometer_reading)   " miles on it.")
        
    def update_odometer(self, mileage):
        """
        Set the odometer reading to the given value.
        Reject the change if it attempts to roll the odometer back.
        """
        if mileage >= self.odometer_reading:
            self.odometer_reading = mileage
        else:
            print("You can't roll back an odometer!")
    
    def increment_odometer(self, miles):
        """Add the given amount to the odometer reading."""
        self.odometer_reading  = miles

electric_car.py

"""A set of classes that can be used to represent electric cars."""

from car import Car

class Battery():
    """A simple attempt to model a battery for an electric car."""

    def __init__(self, battery_size=60):
        """Initialize the batteery's attributes."""
        self.battery_size = battery_size

    def describe_battery(self):
        """Print a statement describing the battery size."""
        print("This car has a "   str(self.battery_size)   "-kWh battery.")  
        
    def get_range(self):
        """Print a statement about the range this battery provides."""
        if self.battery_size == 60:
            range = 140
        elif self.battery_size == 85:
            range = 185
            
        message = "This car can go approximately "   str(range)
        message  = " miles on a full charge."
        print(message)
    
        
class ElectricCar(Car):
    """Models aspects of a car, specific to electric vehicles."""

    def __init__(self, manufacturer, model, year):
        """
        Initialize attributes of the parent class.
        Then initialize attributes specific to an electric car.
        """
        super().__init__(manufacturer, model, year)
        self.battery = Battery()

ElectricCar 类须要接见其父类Car ,因而我们直接将Car 类导入该模块中

from car import Car
from electric_car import ElectricCar

my_beetle = Car('volkswagen', 'beetle', 2015)
print(my_beetle.get_descriptive_name())

my_tesla = ElectricCar('tesla', 'roadster', 2015)
print(my_tesla.get_descriptive_name())

从模块car 中导入了Car 类,并从模块electric_car 中导入ElectricCar 类。接下来,我们建立了一辆一般汽车和一辆电动汽车。这两种汽车都得以准确地建立:

2016 Volkswagen Beetle
2016 Tesla Roadster

正如你看到的,在构造大型项目的代码方面,Python供应了许多选项。熟习统统这些选项很重要,如许你能力肯定哪一种项目构造体式格局是最好的,并能邃晓他人开辟的项目。一最先应让代码构造尽量简朴。先尽量在一个文件中完成统统的事情,肯定统统都能准确运转后,再将类移到自力的模块中。若是你喜好模块和文件的交互体式格局,可在项目最先时就实验将类存储到模块中。先找出让你可以或许编写出可行代码的体式格局,再实验让代码更加构造有序。

七、Python范例库

Python范例库 是一组模块,装置的Python都包罗它。你如今对类的事情道理已有大抵的相识,可以或许最先运用其他递次员编写好的模块了。可运用范例库中的任何函数和类,为此只需在递次开首包罗一条简朴的import 语句。下面来看模块collections 中的一个类——OrderedDict 

字典让你可以或许将信息联系关系起来,但它们不纪录你增加键值对的递次。要建立字典并纪录个中的键—值对的增加递次,可运用模块collections 中的OrderedDict类。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()   ".")

从模块collections 中导入了OrderedDict 类然后建立了OrderedDict 类的一个实例,并将其存储到favorite_languages 中。请注重,这里没有运用花括号,而是挪用OrderedDict() 来建立一个空的有序字典,并将其存储在favorite_languages 中

接下来,我们以每次一对的体式格局增加名字语言对,然后遍历favorite_languages ,将以增加的递次猎取调查效果:

Jen's favorite language is Python.
Sarah's favorite language is C.
Edward's favorite language is Ruby.
Phil's favorite language is Python.

这是一个很不错的类,它兼具列表和字典的重要长处(在将信息联系关系起来的同时保存本来的递次)。等你最先对体贴的实际情况建模时,能够会发明有序字典恰好可以或许知足需求。跟着你对范例库的相识愈来愈深切,将熟习大批可资助你处置惩罚罕见情况的模块。

八、编码范例

  • 类名应接纳驼峰定名法 ,行将类名中的每一个单词的首字母都大写,而不运用下划线。
  • 实例名和模块名都接纳小写花样,并在单词之间加上下划线。
  • 关于每一个类,都应紧跟在类界说背面包罗一个文档字符串。这类文档字符串扼要地形貌类的功用,并遵照编写函数的文档字符串时接纳的花样商定。每一个模块也都应包罗一个文档字符串,对个中的类可用于做甚么举行形貌。
  • 可运用空行来构造代码,但不要滥用。在类中,可运用一个空行来分开要领;而在模块中,可运用两个空行来分开类。
  • 须要同时导入范例库中的模块和你编写的模块时,先编写导入范例库模块的import 语句,再增加一个空行,然后编写导入你本身编写的模块的import 语句。在包罗多条import 语句的递次中,这类做法让人更轻易邃晓递次运用的各个模块都来自何方。
-玖富娱乐是一家为代理招商,直属主管信息发布为主的资讯网站,同时也兼顾玖富娱乐代理注册登录地址。