类和对象
类是对象的蓝图和模板,而对象是类的实例,类是抽象的概念,而对象是具体的东西,类可以产生多个对象,每个对象都有属性和行为,每个对象都是独一无二的。
1.定义类
在python中使用class关键字定义类,在类中使用函数定义方法
#定义一个类
class Student(object):
def __init__(self, name, age):
self.name = name
self.age = age
print("你好,%s 同学" % self.name)
self.number = 123456789
# 定义一个 study 方法
def study(self):
print("%s is studying" % self.name)
# 定义一个更新号码的方法
def update_number(self, new_number):
self.number = new_number
- __init__方法是一个类中的特殊方法,每次调用类创建新的实例时都会自动调用这个方法。
- self 参数: 在__init__方法中包含 self, name, age 三个形参,其中形参 self 是必不可少的,且必须位于其他形参的前面,Python 调用这个 __init__方法来创建实例时,将自动传入实参 self 。每个与类相关联的方法调用都自动传递实参 self ,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
2.使用类创建对象和使用对象
>>> student01 = Student("Bob", 12) # 创建实例对象
你好,Bob同学
>>> student01.name # 访问属性
Bob
>>> student01.study() # 调用方法
Bob is studying
3.修改属性的值
- 直接修改属性的值,通过实例直接修改
>>> student01.age
12
>>> student01.age = 20
>>> student01.age
20
- 通过类方法修改属性,这样不用直接访问属性,将值传给方法,让它在内部更新
>>> student01.number
123456789
>>> student01.update_number(55667788)
>>> student01.number
55667788
4.继承和多态
编写类时,并非总是要从空白开始。如果你要编写的类是另一个现成类的特殊版本,可使用继承 。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类 ,而新类称为子类 。子类继承了其父类的所有属性和方法,同时还可以定义自己的属性和方法。
class Car(object):
def __init__(self, model="BMW", year=2019):
self.model = model
self.year = year
def run(self):
print("the car is running")
# 定义子类时,括号中必须指定父类的名称
class ElectricCar(Car):
def __init__(self):
super().__init__()
self.model = "Tesla"
>>> car = ElectricCar()
>>> car.year
2019
>>> car.model
Tesla
>>> car.run()
the car is running
-
super() 函数:是一个特殊函数,帮助 python 将父类和子类关联起来,这里会调用父类的__init__方法,让子类的实例包含父类所有的属性。
-
子类在继承了父类的方法后,可以对父类已有的方法给出新的实现版本,这个动作称之为方法重写(override)。通过方法重写我们可以让父类的同一个行为在子类中拥有不同的实现版本,当我们调用这个经过子类重写的方法时,不同的子类对象会表现出不同的行为,这个就是多态,如:
class Car(object):
...省略...
class ElectricCar(Car):
def __init__(self):
super().__init__()
self.model = "Tesla"
self.battery_size = 70 #定义子类的特有属性
# 重写父类的方法
def run(self):
print("the car is running on the road!")
>>> car = ElectricCar()
>>> car.run()
the car is running on the road
- 实例会继承所有可读取类的属性,每个实例不仅会从创建它的类中获取变量名,还会从该类的父类中获取,一般顺序是,先检查实例,然后是它的类,最后是所有超类。
class Firstclass(object):
def __init__(self, name='bob', age=23):
self.name = name
self.age = age
def run(self):
print('my name is', self.name)
class Secondclass(Firstclass):
def run(self):
print('my age is', self.age)
>>> f = Secondclass()
>>> f.run() #子类和父类都包含方法run(),按照查找顺序,会优先使用子类中的方法
my age is 23
>>> f.name
bob