python学习9、类

类.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这个别名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值