《Python编程从入门到实践》_第九章_类

创建一个简单的类

根据Dog类创建的每个实列都将存储名字和年龄。我们赋予了每条小狗蹲下(sit())和打滚(roll_over())的能力:

 1 class Dog():
 2     """一次模拟小狗的简单尝试"""
 3     def __init__(self, name, age):
 4         """初始化属性name和age"""
 5         self.name = name
 6         self.age = age
 7     def sit(self):
 8         """模拟小狗被命令时蹲下"""
 9         print(self.name.title() + "now is sitting.")
10     def roll_over(self):
11         """模拟小狗被命令时打滚"""
12         print(self.name.title() + "rolled over!")
13 my_dog = Dog('tom','3')
14 print("my dog name is " + my_dog.name.title() )
根据约定,在Python中,首字母大写的名称指的是类:类中的函数称为方法
方法__init__(),开头和末尾都有2个下划线,这是一种约定,旨在避免Python默认方法与普通方法发生名称的冲突。我们将方法__init__()定义成了包含三个形参: self、 nameage。在这个方法的定义中,self必不可少,还必须位于其他形参的前面。为何必须在方法定义中包含形参self呢?因为Python调用这个__init__()方法来创建Dog实例时,将自动传入实参self。 两个变量self_name和self_age都有前缀self,以self为前缀的变量都可供类中的所有方法使用,我们还可以通过类的任何实列来访问这些变量。像这样可通过实例访问的变量称为属性。
在python2.X中,如果创建类需要在括号后面加上(object)。
 

访问属性

继续上面的例子,方法__init__()创建一个表示特定小狗的示例,并使用我们提供的值来设置属性name和age,方法__init__()并未显式地包含return语句,但python自动返回一个表示这条小狗的示例。我们将这个示例存储在变量my_dog中。
class Dog():
    """一次模拟小狗的简单尝试"""
    def __init__(self, name, age):
        """初始化属性name和age"""
        self.name = name
        self.age = age
    def sit(self):
        """模拟小狗被命令时蹲下"""
        print(self.name.title() + " now is sitting.")
    def roll_over(self):
        """模拟小狗被命令时打滚"""
        print(self.name.title() + " rolled over!")
my_dog = Dog('tom',3)
print(my_dog.name)
print(my_dog.age)
#运行结果
tom
3

 

调用方法

class Dog():
    """一次模拟小狗的简单尝试"""
    def __init__(self, name, age):
        """初始化属性name和age"""
        self.name = name
        self.age = age
    def sit(self):
        """模拟小狗被命令时蹲下"""
        print(self.name.title() + " now is sitting.")
    def roll_over(self):
        """模拟小狗被命令时打滚"""
        print(self.name.title() + " rolled over!")
my_dog = Dog('tom',3)
my_dog.sit()
my_dog.roll_over()
#运行结果
Tom now is sitting.
Tom rolled over!

 根据Dog类创建实例后,就可以使用句点表示来调用Dog来定义的任何方法

 

创建多个实例

class Dog():
    """一次模拟小狗的简单尝试"""
    def __init__(self, name, age):
        """初始化属性name和age"""
        self.name = name
        self.age = age
    def sit(self):
        """模拟小狗被命令时蹲下"""
        print(self.name.title() + " now is sitting.")
    def roll_over(self):
        """模拟小狗被命令时打滚"""
        print(self.name.title() + " rolled over!")
my_dog = Dog('tom',3)
your_dog = Dog('Mei',2)
print("My dog name is " + my_dog.name.title())
print("Your dog name is " + your_dog.name.title())
#运行结果
My dog name is Tom
Your dog name is Mei

 可按需求根据类创建任意数量的实例。

 

使用类和实例

给属性指定默认值

类中的每个属性都必须有初始值,哪怕这个值是0或空字符串,在有些情况下,如设置默认值时,在方法__init__()内指定这种初始值时可以的没如果你对某个属性这样做了,就无需包含为他提供初始化的形参。
class Car():
    """一次模拟汽车的简单尝试"""
    def __init__(self, make, model, year):
        """汽车的初始化"""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 100
    def get_descri_name(self):
        """描述汽车"""
        long_name = str(self.year) + ' ' + self.model + ' ' + self.make
        return long_name
my_car = Car('audi', 'a4', '2017')
print(my_car.model)
print(my_car.get_descri_name())
#运行结果
a4
2017 a4 audi

 直接修改属性的值

class Car():
    """一次模拟汽车的简单尝试"""
    def __init__(self, make, model, year):
        """汽车的初始化"""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 100
    def get_descri_name(self):
        """描述汽车"""
        long_name = str(self.year) + ' ' + self.model + ' ' + self.make
        return long_name
my_car = Car('audi', 'a4', '2017')
print(my_car.get_descri_name())
my_car.year = 2016
print(my_car.get_descri_name())
#运行结果
2017 a4 audi
2016 a4 audi

 通过方法修改

class Car():
    """一次模拟汽车的简单尝试"""
    def __init__(self, make, model, year):
        """汽车的初始化"""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 100
    def get_descri_name(self):
        """描述汽车"""
        long_name = str(self.year) + ' ' + self.model + ' ' + self.make
        return long_name
    def update(self, mile):
        """更新里程值"""
        if mile > self.odometer_reading:
            self.odometer_reading = mile
        else:
            print("You can't roll back an odometer")
    def increment_odometer(self,mile):
        """增加里程"""
        self.odometer_reading += mile
    def read_odometer(self):
        """打印汽车的里程"""
        print("This car has " + str(self.odometer_reading) + " miles on it.")
my_car = Car('audi', 'a4', '2017')
my_car.read_odometer()
my_car.odometer_reading = 10    #直接修改里程值
my_car.update(200)     #通过方法修改里程
my_car.read_odometer()
my_car.increment_odometer(10)
my_car.read_odometer()
#运行结果
This car has 100 miles on it.
This car has 200 miles on it.
This car has 210 miles on it.

 

 

 继承

 如果我们想再一个class继承另一个类的属性,可以在类后面括号中加入类的名称,举例如下:

class Car():
    """一次模拟汽车的简单尝试"""
    def __init__(self, make, model, year):
        """汽车的初始化"""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 100
    def get_descri_name(self):
        """描述汽车"""
        long_name = str(self.year) + ' ' + self.model + ' ' + self.make
        return long_name
    def update(self, mile):
        """更新里程值"""
        if mile > self.odometer_reading:
            self.odometer_reading = mile
        else:
            print("You can't roll back an odometer")
    def increment_odometer(self,mile):
        """增加里程"""
        self.odometer_reading += mile
    def read_odometer(self):
        """打印汽车的里程"""
        print("This car has " + str(self.odometer_reading) + " miles on it.")
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_descri_name())
#运行结果
2016 model s tesla

为了继承父类的属性,还需要加入一个特殊的函数super(),帮助python将夫类和子类关联起来。

在python2.X中,类supper的格式如下:supper(Eletric,self).__init__(make, model, year)
给子类定义属性和方法
让一个类继承另一个类后,可添加区分子类和父类所属的新属性和新方法。
将实例用作属性
class Car():
    """一次模拟汽车的简单尝试"""
    def __init__(self, make, model, year):
        """汽车的初始化"""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 100
    def get_descri_name(self):
        """描述汽车"""
        long_name = str(self.year) + ' ' + self.model + ' ' + self.make
        return long_name
    def update(self, mile):
        """更新里程值"""
        if mile > self.odometer_reading:
            self.odometer_reading = mile
        else:
            print("You can't roll back an odometer")
    def increment_odometer(self,mile):
        """增加里程"""
        self.odometer_reading += mile
    def read_odometer(self):
        """打印汽车的里程"""
        print("This car has " + str(self.odometer_reading) + " miles on it.")
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_descri_name())
my_tesla.battery.describe_battery()
#运行结果
2016 model s tesla
This car has a 70-kwh battery.

 

 导入类

导入单个或者多个类
一个文件car.py
class Car():
    """一次模拟汽车的简单尝试"""
    def __init__(self, make, model, year):
        """汽车的初始化"""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 100
    def get_descri_name(self):
        """描述汽车"""
        long_name = str(self.year) + ' ' + self.model + ' ' + self.make
        return long_name
    def update(self, mile):
        """更新里程值"""
        if mile > self.odometer_reading:
            self.odometer_reading = mile
        else:
            print("You can't roll back an odometer")
    def increment_odometer(self,mile):
        """增加里程"""
        self.odometer_reading += mile
    def read_odometer(self):
        """打印汽车的里程"""
        print("This car has " + str(self.odometer_reading) + " miles on it.")

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_car.py,导入一个类

from  car import Car
my_car = Car('audi', 'a4', '2017')

 一个模块中可以存储多个类,所以可以一次导入多个类

from car import Car,Battery,ElectricCar
my_tesla = ElectricCar('tesla', 'model s', '2016')
print(my_tesla.get_descri_name())
my_tesla.battery.describe_battery()

 导入整个模块

import car     #导入整个模块的时候,需要使用句点表示法访问需要的类
my_tesla = car.ElectricCar('tesla', 'model s', '2016')
print(my_tesla.battery)

 导入所有类

from car import *    #导入所有的类

 

 

 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

posted @ 2017-06-23 16:58  liubinsh  阅读(2965)  评论(0编辑  收藏  举报