美文网首页
Chapter 09:类

Chapter 09:类

作者: 蜜糖_7474 | 来源:发表于2018-12-18 22:55 被阅读0次

__init__就是构造函数,self相当于this指针,只不过是必须写出来的,不能省

class Dog():
    def __init__(self, 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!')

对类成员和方法的调用,各类语言都是相通的

my_dog = Dog('whllie', 6)
print("My dog's name is " + my_dog.name.title() + '.')
print("My dog is " + str(my_dog.age) + " years old")
my_dog.sit()
my_dog.roll_over()

My dog's name is Whllie.
My dog is 6 years old
Whllie is now sitting.
Whllie rolled over!

class Car():
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year

    def get_descriptive_name(self):
        long_name = str(self.year) + ' ' + self.make + ' ' + self.model
        return long_name
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())

2016 audi a4

类属性可以有默认值

class Car():
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 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_reading)+' miles on it')
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer()

2016 Audi A4
This car has 0 miles on it

类属性直接修改

my_new_car.odometer_reading=23
my_new_car.read_odometer()

This car has 23 miles on it

直接修改属性不太好,常规操作是通过方法修改

class Car():
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 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_reading)+' miles on it')
    
    def update_odometer(self,mileage):
        self.odometer_reading=mileage
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer()
my_new_car.update_odometer(23)
my_new_car.read_odometer()

2016 Audi A4
This car has 0 miles on it
This car has 23 miles on it

众所周知,开倒车也不会让里程数减少

class Car():
    def __init__(self, make, model, year):
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 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_reading)+' miles on it')
    
    def update_odometer(self,mileage):
        if mileage>self.odometer_reading:
            self.odometer_reading=mileage
        else:
            print("You can't roll back an odometer!")
my_new_car = Car('audi', 'a4', 2016)
print(my_new_car.get_descriptive_name())
my_new_car.read_odometer()
my_new_car.update_odometer(23)
my_new_car.read_odometer()
my_new_car.update_odometer(13)
my_new_car.read_odometer()

2016 Audi A4
This car has 0 miles on it
This car has 23 miles on it
You can't roll back an odometer!
This car has 23 miles on it

类自然可以继承

定义子类时,必须在括号内指定父类的名称
super()是一个特殊函数,帮助Python将父类和子类关联起来。
这行代码让Python调用ElectricCar的父类的方法init(),让ElectricCar实例包含父类的所有属性。
父类也称为超类(superclass),名称super因此而得名

class ElectricCar(Car):
    def __init__(self, make, model, year):
        super().__init__(make, model, year)
my_tesla = ElectricCar('tesla', 'model s', 2018)
print(my_tesla.get_descriptive_name())

2018 Tesla Model S

添加子类独有属性

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.")
my_tesla = ElectricCar('tesla', 'model s', 2018)
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()

2018 Tesla Model S
This car has a 70-kWh battery.

重写父类的方法

假设Car类有一个名为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():
        print("This car doesn't need a gas tank!")

将类实例作为属性

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.')

    def get_range(self):
        if self.battery_size == 70:
            range = 240
        elif self.battery_size == 85:
            range = 270


class ElectricCar(Car):
    def __init__(self, make, model, year):
        super().__init__(make, model, year)
        self.battery = Battery()

    def describe_battery(self):
        print("This car has a " + str(self.battery_size) + "-kWh battery.")

    def fill_gas_tank():
        print("This car doesn't need a gas tank!")
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.

相关文章

网友评论

      本文标题:Chapter 09:类

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