美文网首页python3
Head First Python 读书笔记(六)

Head First Python 读书笔记(六)

作者: icessun | 来源:发表于2018-07-16 11:52 被阅读0次

类:抽象行为和状态

  • 类:将行为和状态打包在一个对象中

采用驼峰命名法

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的方法
  • 较高的逻辑层面去考虑,如何用代码来表示实物,所谓的现实世界建模

相关文章

网友评论

    本文标题:Head First Python 读书笔记(六)

    本文链接:https://www.haomeiwen.com/subject/iifdpftx.html