一、创建和使用类
1.创建Dog类
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中,首字母大写的名称指的是类。这个类定义中的括号是空的,因为我们要从空白创建这个类。
①类中的函数称为方法。其中__init__()是一个特殊的方法,每当你根据Dog类创建新实例时,Python都会自动运行它。
在方法__init__()中,形参self必不可少,还必须位于其他形参的前面。因为Python调用这个__init__()方法来创建Dog实例时,将自动传入实参self,它是一个指向实例本身的引用。
通过实参向Dog传递名字和年龄;self会自动传递。因此当我们根据Dog类创建实例时,都只需要给最后两个形参(name和age)提供值。
②以self为前缀的变量都可供类中所有方法使用,我们还可以通过类的任何实例来访问这些变量。self.name=name获取存储在形参name中的值,并将其存储到变量name中,然后该变量被关联到当前创建的实例,像这样可通过实例访问的变量称为属性。
2.根据类创建实例
my_dog = Dog('willie',6)
print('My dog\'s name is '+my_dog.name.title()+'.')
print('My dog is '+str(my_dog.age)+' years old.')
在第一行代码中,Python使用实参'willie'和6调用Dog类中的方法__init__()。方法__init__()并未显式的包含return语句,但Python自动返回一个表示这条小狗的实例,我们将这个实例存储在变量my_dog中。
①访问属性
my_dog.name
②调用方法
my_dog.sit()
Willie is now sitting.
二、使用类和实例
1.给属性指定默认值
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.
2.修改属性的值
①直接修改属性的值
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.odometer_reading=23 #通过实例直接访问属性
my_new_car.read_odometer()
2016 Audi A4
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.update_odometer(23)
my_new_car.read_odometer()
2016 Audi A4
This car has 23 miles on it.
三、继承
一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类,而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。
1.子类的方法__init__()
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
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将父类和子类关联起来,让实例包含父类的所有属性。
2.给子类定义属性和方法
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','2016')
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()
2016 Tesla Model S
This car has a 70-kwh battery.
根据ElectricCar类创建的所有实例都将包含这个属性,但所有Car实例都不包含它。
3.重写父类的方法
可在子类中定义一个这样的方法,即它与要重写的父类方法同名。这样,Python将不会考虑这个父类方法,而只关注子类中定义的相应方法。
4.将实例用作属性
可以将大型类拆分成多个协同工作的小类。
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
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() #将实例用作属性
def describe_battery(self):
print('This car has a '+str(self.battery_size)+'-kwh battery.')
my_tesla = ElectricCar('tesla','model S','2016')
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
2016 Tesla Model S
This car has a 70-kwh battery.
上例中将某些属性和方法提炼出来,放到另一个名为Battery的类中,并将一个Battery实例用作ElectricCar类的一个属性。
四、类编码风格
类名应采用驼峰命名法,即将类名中的每个单词的首字母都大写,而不是用下划线。实例名和模块名都采用小写格式,并在单词之间加上下划线。
在类中,可使用一个空行来分隔方法;而在模块中,可使用两个空行来分隔类。