• 《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 *    #导入所有的类
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    NYOJ 625 笨蛋的难题(二)
    NYOJ 102 次方求模
    ZJU Least Common Multiple
    ZJUOJ 1073 Round and Round We Go
    NYOJ 709 异形卵
    HDU 1279 验证角谷猜想
    BNUOJ 1015 信息战(一)——加密程序
    HDU 1202 The calculation of GPA
    "蓝桥杯“基础练习:字母图形
    "蓝桥杯“基础练习:数列特征
  • 原文地址:https://www.cnblogs.com/liubinsh/p/7070794.html
Copyright © 2020-2023  润新知