先考虑一个类:
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!")
方法__init__():
类中的函数统称为方法,而__init__()是一个很特殊的方法,每当用这个类创建实例的时候,Python就会自动运行这个方法(可以类比C++中的构造函数);在__init__()的形参中,self是必不可少且必须位于其他形参前面的形参,它是一个指向实例本身的引用,同时self会自动传递,不需要我们手动传递;且以self为前缀的变量都可供类中所有方法使用,而可被实例访问的变量称为属性。
__init__()未显式的包含return语句,但会自动返回一个相关类的实例。
关于修改属性的值,我们有两种方法;
1、直接修改属性的值:
class Car():
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
def read_odometer(self):
print("This car has " + str(self.odometer_reading) + " miles on it.")
my_new_car = Car('audi', 'a4', 2016)
my_new_car.odometer_reading = 23 // 直接修改
my_new_car.read_odometer()
2、通过方法修改属性的值:
class Car():
--snip--
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.update_odometer(23)
my_new_car.read_odometer()
关于继承:
class Car():
--snip--
class ElectricCar(Car):
def __init__(self, make, model, year):
super().__init__(make, model, year)
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
super()是一个特殊的函数,这行代码让python能够调用父类的方法__init__,父类也称为“超类”(superclass),名称super因此得名;
关于父类重写的方法:
对于部分的父类方法,可能并不符合子类模拟事物的方式,便可以对其进行重写;例如在子类中定义一个方法,其与想要重写的父类方法同名,这样的话,python就不会再考虑这个父类方法,而是只关注在子类中定义的相应方法。
例如,假设Cars有一个名为fill_gas_tank()的方法,这对电动车没有意义,因为电动车连油箱都没有!所以可以这么写:
class Car():
--snip--
def ElectricCar(Car):
--snip--
def fill_gas_tank():
print("This car doesn't need a gas tank!")
这样,子类就可以保留父类的精华,去除不必要的“糟粕”;
关于将实例用作属性:
用代码模仿实物的时候,可能发现给类添加的细节越来越多了,这时,可以考虑将类的一部分,作为一个独立的类抽离出来,从而可将大类拆分成多个协同工作的小类。
我们将电池作为一个类抽离出来作为例子:
class Car():
--snip--
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):
super().__init__(make, model, year)
self.battery = Battery()
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
这里,我们定义了一个新类叫做Battery,它没有继承任何的类;