Python从入门到实战:第九章学习笔记
第九章:类
创建和使用类
# 创建Dog类
class Dog():
"""一次模拟小狗的简单操作"""
def __init__(self, name, old): #注意这里init的颜色
"""初始化name和old属性"""
self.name = name
self.old = old
def set(self): #以self为前缀的变量都可供类中的所有方法使用,虽然这个方法用到了self.name,但是这里不需要在添加它的形参。
print("这个小狗正在坐下!" + self.name.title())
def roll_over(self):
print("这个小狗正在打滚!" + self.name.title())
类中的函数称为方法,方法__init__()是一个特殊的方法,每当你根据Dog类创建新实例时,Python都会自动运行它,形参self必不可少,还必须位于其他形参的前面,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
**以self为前缀的变量都可供类中的所有方法使用,**self.name = name获取存储在形参name中的值,并将其存储到变量name中,然后该变量被关联到当前创建的实例,该变量被称为属性。
Dog类还定义了另外两个方法:sit()和roll_over()。由于这些方法不需要额外的信息,如名字或年龄,因此它们只有一个形参self。
根据类来创建实列
my_dog = Dog('jim', 6)
print("My dog's name is " + my_dog.name.title())
print("My dog's old is " + str(my_dog.old))
#My dog's name is Jim
#My dog's old is 6
表示一条小狗的实列,存储在变量my_dog中,要注意:我们通常可以认为首字母大写的名称(如Dog)指的是类,而小写的名称(如my_dog)指的是根据类创建的实例。
访问实列的属性,句点表示:my_dog.name
调用类中的方法,句点表示:my_dog.sit()
(1)给属性指定默认值
设置默认值时,在方法__init__()内指定;如果对某个属性这样做了,就无需包含为它提供初始值的形参。
class Car():
def __init__(self, name, make, year):
"""设置属性,如果某一个属性设置了默认值,就不需要再设置形参了!"""
self.name = name
self.make = make
self.year = year
self.odometer_reading = 0 #没有其对应的形参
(2)修改属性的值
通过实列修改:实列名.属性=xx
通过方法修改:实例名.方法(xx)
继承:
编写类时,并非总是要从空白开始。如果你要编写的类是另一个现成类的特殊版本,可使用继承。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类,而新类称为子类。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。
class Car():
---------
# 父类写好之后,写子类
class ElectriCar(Car):
def __init__(self, name, make, year):
"""初始化父类的属性"""
super().__init__(name, make, year)
super()是一个特殊函数,帮助Python将父类和子类关联起来.
#实列化
my_car = ElectriCar('audo', 'china', 2017)
message = my_car.describe_car()
print(message)
#2017 Audo china
(1)给子类定义新的属性和方法
# 给子类添加一些新的属性
class ElectriCar(Car):
def __init__(self, name, make, year):
"""初始化父类的属性"""
super().__init__(name, make, year)
"""添加子类的新属性"""
self.battery_size = 70
def show_battery_size(self):
print("这个新型电车的电池大小为 " + str(self.battery_size))
your_car = ElectriCar('audo', 'china', 2017)
your_car.show_battery_size()
#这个新型电车的电池大小为 70
(2)重新:对于父类的方法,只要它不符合子类模拟的实物的行为,都可对其进行重写。为此,可在子类中定义一个这样的方法,它与要重写的父类方法同名即可,
(3)将实列作为属性
在实际中,可能会遇到类的细节越来越多,需要将大类的一部分作为一个单独的小类提取出来,再把这个小类的实例用作大类的一个属性。
#父类
class User():
"""存储用户的基本信息"""
def __init__(self, first_name, last_name, school, old):
"""先设置好属性"""
self.first_name= first_name
self.last_name = last_name
self.school = school
self.old = old
self.login_attempts = 0
def greet_user(self):
print("小的给你请安了 " + self.last_name+ '大大~~')
# 编写类作为属性
class Privilege():
def __init__(self):
self.privilege_1 = '改变地球'
def show_privileges(self):
print("这个管理员的能力就是" + self.privilege_1)
#子类
class Admin(User):
def __init__(self, first_name, last_name, school, old):
"""初始化父类的属性"""
super().__init__(first_name, last_name, school, old)
"""添加子类的新属性privilege,并且是把类作为属性"""
self.privilege = Privilege()
user_1 = Admin("元", "小玉", "无名大学", '22')
#调用实列化user_1的属性privilege中的方法
user_1.privilege.show_privileges() #这个管理员的能力就是改变地球