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 语句的程序中,这种做法让人更容易明白程序使用的各个模块都来自何方。

  • 相关阅读:
    9.算术运算符
    7.字符串格式化
    下载和配置JDK
    Set-常用API及详解
    List-ApI及详解
    电路交换、报文交换、分组交换比较
    集合之List—ArrayList
    java的getClass()函数
    Object类、包装类、内部类详解
    接口的探究
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/6853671.html
Copyright © 2011-2022 走看看