类:抽象行为和状态
- 类:将行为和状态打包在一个对象中
采用驼峰命名法
class Dog():
"""创建了狗类"""
def __init__(self, name:str, age:int) -> None:
'''初始化属性name和age'''
self.name = name
self.age = age
def sit(self) -> None:
'''模拟小狗蹲下'''
print(self.name.title()+' is now sitting.')
def roll_over(self) -> None:
'''模拟小狗打滚'''
print(self.name.title()+' rolled over!')
taidi = Dog('taidi', 2) # 对象实例化
print(taidi.sit())
self
解读- 类似于其他语言中的
this
- 类中方法的参数第一个必须是
self
,且一定要存在,不存在会报错 - 为什么类中的方法一定要有
self
呢?
taidi.sit() # 实例化的对象调用类中的方法 相当于: Dog.sit(taidi) # 解释器是这样执行的:类调用自己的方法把实例化的对象作为一个参数传递进去 也就说明:类中的方法的第一个参数是必要的,用于接收类所创建的实例化对象,约定名称为`self`,是对实例对象的一个引用,让实例能够访问类中的属性和方法
- 类似于其他语言中的
方法
__init__()
- 类似于其他语言中的构造函数,对值的初始化
- 初始化类中的属性变量,关联到被创建的实例化对象上面
- 以
self
为前缀的属性都可以被类中的所有方法使用 - 当然也可以利用函数的默认参数,为类中的属性设置默认值
方法是共享的,属性不共享
类中的方法由同一个类创建的所有实例对象所共享,类中的属性不会由同一个类创建的其他对象所共享
>>> type(d) # 对象的类型
<class '__main__.Dog'>
>>> id(d) # 对象在内存中的地址
92579984
>>> hex(id(d)) # 地址转为十六进制数
'0x584a890'
继承
class Car():
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
self.odometer = 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)+" miles on it.")
def update_odometer(self, mileage):
if mileage >= self.odometer:
self.odometer = mileage
else:
print('You can`t roll back an odometer!')
def increment_odometer(self, miles):
self.odometer += miles
def fill_gas_tank(self):
print('this car has 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(self):
print('This car doesn`t need a gas tank')
my_tesla = ElectricCar('tesla', 'model s', 2016)
print(my_tesla.get_descriptive_name())
- 子类继承父类
# 子类中传入父类作为参数,并且需要调用 super 方法去为父类初始化值
class ElectricCar(Car):
def __init__(self, make, model, year):
super().__init__(make, model, year)
super()
是为了让子类和父类关联起来可以重写父类的方法,也可以添加属于子类的方法和属性
将大型的类拆分为多个协同工作的小类
类的实例对象用作属性
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):
self.battery_size = Battery() # 类的实例对象作为子类实例属性,默认值为70
super().__init__(make, model, year)
def fill_gas_tank(self):
print('This car doesn`t need a gas tank')
my_tesla = ElectricCar('tesla', 'model s', 2016)
my_tesla.battery_size.describe_battery() # 子类的实例对象的属性去调用Battery的方法
- 较高的逻辑层面去考虑,如何用代码来表示实物,所谓的现实世界建模