zoukankan      html  css  js  c++  java
  • Head First Python 读书笔记(六)

    类:抽象行为和状态

    • 类:将行为和状态打包在一个对象中
      采用驼峰命名法
    class Dog():
        """创建了狗类"""
    
        def __init__(self, name:str, age:int) -> None:
            '''初始化属性name和age'''
            self.name = name
            self.age = age
    
        def sit(self) -> None:
            '''模拟小狗蹲下'''
            print(self.name.title()+' is now sitting.')
    
        def roll_over(self) -> None:
            '''模拟小狗打滚'''
            print(self.name.title()+' rolled over!')
    
    
    taidi = Dog('taidi', 2)  # 对象实例化
    print(taidi.sit())
    • self解读

      • 类似于其他语言中的this
      • 类中方法的参数第一个必须是self,且一定要存在,不存在会报错
      • 为什么类中的方法一定要有self呢?
        taidi.sit()   # 实例化的对象调用类中的方法
        相当于:
        Dog.sit(taidi)    # 解释器是这样执行的:类调用自己的方法把实例化的对象作为一个参数传递进去
        
        也就说明:类中的方法的第一个参数是必要的,用于接收类所创建的实例化对象,约定名称为`self`,是对实例对象的一个引用,让实例能够访问类中的属性和方法
    • 方法__init__()

      • 类似于其他语言中的构造函数,对值的初始化
      • 初始化类中的属性变量,关联到被创建的实例化对象上面
      • self为前缀的属性都可以被类中的所有方法使用
      • 当然也可以利用函数的默认参数,为类中的属性设置默认值
    • 方法是共享的,属性不共享

      类中的方法由同一个类创建的所有实例对象所共享,类中的属性不会由同一个类创建的其他对象所共享

    单独使用对象名称

    >>> type(d) # 对象的类型
    <class '__main__.Dog'>
    >>> id(d)  # 对象在内存中的地址
    92579984
    >>> hex(id(d))  # 地址转为十六进制数
    '0x584a890'

    继承

    class Car():
        def __init__(self, make, model, year):
            self.make = make
            self.model = model
            self.year = year
            self.odometer = 0
    
        def get_descriptive_name(self):
            long_name = str(self.year)+' '+self.make+' '+self.model
            return long_name.title()
    
        def read_odometer(self):
            print("this car has "+str(self.odometer)+" miles on it.")
    
        def update_odometer(self, mileage):
            if mileage >= self.odometer:
                self.odometer = mileage
            else:
                print('You can`t roll back an odometer!')
    
        def increment_odometer(self, miles):
            self.odometer += miles
    
        def fill_gas_tank(self):
            print('this car has fill gas tank!')
    
    # 电动汽车 继承 汽车类
    class ElectricCar(Car):
        def __init__(self, make, model, year):
            super().__init__(make, model, year)
            self.battery_size = 70 # 定义了属于子类的方法和属性
    
        def describe_battery(self):
            print("this car has a "+str(self.battery_size) + '-KWH battery.')
    
        def fill_gas_tank(self):
            print('This car doesn`t need a gas tank')
    
    my_tesla = ElectricCar('tesla', 'model s', 2016)
    print(my_tesla.get_descriptive_name())
    • 子类继承父类
    # 子类中传入父类作为参数,并且需要调用 super 方法去为父类初始化值
    class ElectricCar(Car):
        def __init__(self, make, model, year):
            super().__init__(make, model, year)
    • super()是为了让子类和父类关联起来
    • 可以重写父类的方法,也可以添加属于子类的方法和属性

    • 将大型的类拆分为多个协同工作的小类类的实例对象用作属性

    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):
            self.battery_size = Battery()  # 类的实例对象作为子类实例属性,默认值为70
            super().__init__(make, model, year)
    
        def fill_gas_tank(self):
            print('This car doesn`t need a gas tank')
    
    
    my_tesla = ElectricCar('tesla', 'model s', 2016)
    
    my_tesla.battery_size.describe_battery() # 子类的实例对象的属性去调用Battery的方法
    • 较高的逻辑层面去考虑,如何用代码来表示实物,所谓的现实世界建模
  • 相关阅读:
    python 开发中的常用功能
    python 栈&队列&列表的区别
    python 内置函数简介及其作用
    python 正则表达式详解
    python scrapy
    python 文件操作
    python 爬虫实例
    浅谈tcp 与udp
    php正则匹配video 中或者img的宽度和高度。
    android技术积累:开发规范
  • 原文地址:https://www.cnblogs.com/linewman/p/9918353.html
Copyright © 2011-2022 走看看