类.py
# 编写表示现实世界中的事物和情景的类class,并基于这些类来创建对象,每个对象都具有通用类型
# 根据类来创建对象称为实列化,使用类的实列--类几乎可以模拟所有东西
# 使用class来创建类
class Dog:
def __init__(self, name, age):
""""下面两行是初始化name和age这两个属性,利用传递进来的参数name和age"""
self.name = name
self.age = age
def sit(self):
""""定义了sit方法"""
print(f"{self.name} is now sitting.")
def roll_over(self):
""""self实参是一个指向实列本身的引用,通过句号运算符来访问实列中的属性和方法"""
print(f"{self.name} rolled over!")
my_dog = Dog('willie', 6)
""""创建了一个实列my_dog"""
print(my_dog.name)
"""利用点号访问其中的属性,在c++中这叫成员变量"""
my_dog.sit()
my_dog.roll_over()
""""也可以利用点号来调用Dog中的方法"""
your_dog = Dog('back', 18)
""""可以根据类创建任意数量的实列,实列与实列之间是独立的!"""
class Car:
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
"""给属性odometer_reading指定默认值,并没有通过参数进行指定"""
def get_descriptive_name(self):
long_name = f"{self.make} {self.model} {self.year}"
return long_name.title()
def reading_odometer(self):
"""直接利用默认属性编写的方法"""
print(f"{self.odometer_reading}")
def update_odometer(self, mileage):
""""利用方法间接修改属性的值"""
self.odometer_reading = mileage
def increment_odometer(self, miles):
"""通过方法让属性的值递增"""
self.odometer_reading += miles
my_car = Car('audi', 'a6', 2024)
"""传递过去的实参会先传递到init的方法中进行属性初始化"""
print(my_car.get_descriptive_name())
my_car.odometer_reading = 23
"""直接利用点号修改属性的值"""
my_car.update_odometer(23)
""""利用方法间接修改属性的值,实现在外部进行修改"""
my_car.increment_odometer(100)
"""通过方法让属性的值递增"""
# 继承----编写的是一个既有类的特殊版本,可以使用继承,自动继承后者的所有属性和类
# 所有的类称为父类,新类称为子类,不仅可以继承父类所有属性和方法,还可以定义自己的属性和方法
class ElectricCar(Car):
"""父类Car必须包含在当前文件中"""
def __init__(self, make, model, year):
"""初始化父类属性"""
super().__init__(make, model, year)
"""直接添加一个新属性+初始化,原来的Car类是没有的"""
self.battery_size = 40
def describe_battery(self):
"""定义了Car未有的方法---给子类添加新方法"""
print(f"{self.battery_size}!")
# supper()是个特殊函数,让你调用父类的方法--调用_int_()方法,包含这个方法定义的所有属性
my_leaf = ElectricCar('nissan', 'leaf', '2024')
print(my_leaf.get_descriptive_name())
# 给子类定义属性和方法--见77和79行
# 重写父类中的方法--使用同名--python将自动忽略父类中同名的方法--只关注子类中相对的方法-P52页
# 将实列用作属性--将大类分成多个协同工作类,这种方式称为组合
class People:
def __init__(self, name, age, adress):
self.name = name
self.age = age
self.adress = adress
"""将实列car作属性进行初始化"""
self. car = Car('bmw', 'hellow', 2024)
def get_name_title(self):
temp = f"{self.name}"
return temp.title()
person1 = People('xiaohan', 19, 'guangdong')
print(person1.car.get_descriptive_name())
"""将实列初始化为属性---用我的话来说就是复合调用句号运算符"""
# 在用python模拟实物时,关注的应该是如何用代码来表示实际事物
# 在表示效果相同的时候--就要考虑效率的问题!!!
类库1.py
# python允许你将类存储在模块中,然后在主程序中导入所需的模块
from 类 import People
class Car:
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
self.odometer_reading = 0
"""给属性odometer_reading指定默认值,并没有通过参数进行指定"""
def get_descriptive_name(self):
long_name = f"{self.make} {self.model} {self.year}"
return long_name.title()
def reading_odometer(self):
"""直接利用默认属性编写的方法"""
print(f"{self.odometer_reading}")
def update_odometer(self, mileage):
""""利用方法间接修改属性的值"""
self.odometer_reading = mileage
def increment_odometer(self, miles):
"""通过方法让属性的值递增"""
self.odometer_reading += miles
class ElectricCar(Car):
def __init__(self, make, model, year):
super().__init__(make, model, year)
self.battery = 50
person1 = People('xiaohan', 19, 'fujian')
my_car.py
# 导入类模块
"""导入类是一种高效的编程方式可以更加专注主程序的高级逻辑"""
from 类库1 import Car, ElectricCar
# 可以从一个模块中导入多个类,如果只是导入一个类,就不用加后面的 , ElectricCar
my_car = Car('audi', 'a4', 2024)
print(my_car.get_descriptive_name())
my_car.odometer_reading = 23
my_car.reading_odometer()
my_electricCar = ElectricCar('bmw', 'car', 2024)
# 导入整个模块,那么整个模块的类和函数--一样用点号来进行访问!!!
# 导入模块中所有的类--可以使用from module_name import *
# 但一般不这么用--这种导入方法没有明确指出使用了模块中的那些类--会引发名称疑惑
# 如果重名的话--将引发难以诊断的错误
# 使用别名使用as:from electric_car import ElectricCar as Ec
# 但要创建电动车实列时,可以用Ec这个别名