• 《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 *    #导入所有的类
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    C# 使用正则表达式按指定长度分割字符串
    C# vs2017创建Com组件,并注册
    js将4个字节型字符串转为Float
    js 替换字符串中的双引号
    js截取两个字符串之间的子字符串
    C# Winform设计运行时,界面模糊
    Scala字节数组转换为数字
    Scala环境搭建及Intellij IDEA安装
    C# 循环时,操作另外一个进程直到操作完成,循环继续执行
    如何搭建node
  • 原文地址:https://www.cnblogs.com/liubinsh/p/7070794.html
Copyright © 2020-2023  润新知