zoukankan      html  css  js  c++  java
  • Python第二弹--------类和对象

    Python中的任何一条数据都是对象。每个对象都由3部分组成:标识、类型和值。对象的标识代表该对象在内存中的存储位置(因此是不可更改的),对象的类型表明它可以拥有数据和值的类型。

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

    dog.py
    
    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!")

           这里需要注意的地方很多,但你也不用担心,本章充斥着这样的结构,你有大把的机会熟悉它。我们定义了一个名为 Dog 的类。根据约定,在Python中,首字母大写的名称指的是类。
    这个类定义中的括号是空的,因为我们要从空白创建这个类。
    1. 方法 __init__()
           类中的函数称为方法;你前面学到的有关函数的一切都适用于方法,就目前而言,唯一重要的差别是调用方法的方式。方法 __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 shiziDog(Dog)
    
        def __init__(self, name, age):
               super().__init__(name, age)

    导入类:

           虽然同一个模块中的类之间应存在某种相关性,但可根据需要在一个模块中存储任意数量的类。类 Battery 和 ElectricCar 都可帮助模拟汽车,因此下面将它们都加入模块car.py中:

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

    现在,可以新建一个名为my_electric_car.py的文件,导入 ElectricCar 类,并创建一辆电动汽车了:
    my_electric_car.py

    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.

    类编码风格:

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

           对于每个类,都应紧跟在类定义后面包含一个文档字符串。这种文档字符串简要地描述类的功能,并遵循编写函数的文档字符串时采用的格式约定。每个模块也都应包含一个文档字符串,对其中的类可用于做什么进行描述。

          可使用空行来组织代码,但不要滥用。在类中,可使用一个空行来分隔方法;而在模块中,可使用两个空行来分隔类。

          需要同时导入标准库中的模块和你编写的模块时,先编写导入标准库模块的 import 语句,再添加一个空行,然后编写导入你自己编写的模块的 import 语句。在包含多条 import 语句的程序中,这种做法让人更容易明白程序使用的各个模块都来自何方。

  • 相关阅读:
    topcoder srm 681 div1
    topcoder srm 683 div1
    topcoder srm 684 div1
    topcoder srm 715 div1
    topcoder srm 685 div1
    topcoder srm 687 div1
    topcoder srm 688 div1
    topcoder srm 689 div1
    topcoder srm 686 div1
    topcoder srm 690 div1 -3
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/6853671.html
Copyright © 2011-2022 走看看