Python学习9

"""

第9章  类

"""

# 9.1.1 创建Dog类
"""
类中的函数称为方法
Python调用__init__()方法创建Dog实例时,将自动传入实参self
self是一个指向实例本身的引用,让实例能够访问类中的属性和方法

"""

class Dog():
    """一次模拟小狗的简单尝试"""
    
    # 方法__init__()是一个特殊方法,故不可改变
    
    def __init__(self,name,age):            #约定前后各有两根线
        """初始化属性的name和age"""
        self.name = name
        self.age = age

    def sit(self):
        """模拟小狗被命令时蹲下"""
        print(self.name.title() + " is now sitting.")

    def roll_over(self):
        """模拟小狗被命令时打滚"""
        print(self.name.title() + " rolled over! ")


        
# 9.1.2 根据类创建实例

my_dog = Dog('willie',6)

print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")

my_dog.sit()            # 实例名称.调用方法
my_dog.roll_over()



# 9.2.1 Car 类
class Car():
    """一次模拟汽车的简单尝试"""
    def __init__(self,make,model,year):
        self.make = make
        self.model = model
        self.year = year

    def get_descriptive_name(self):
        """返回整洁的描述性信息"""
        long_name = str(self.year) + ' ' + self.make + ' ' +self.model
        return long_name.title()

my_new_car = Car('audi','a4',2016)
print(my_new_car.get_descriptive_name())



# 9.2.2 给属性指定默认值
"""类中每个属性必须有初始值,哪怕是0或者空字符串"""

class Car():

    def __init__(self,make,model,year):
        """初始化描述汽车的属性"""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 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_reading) + " miles on it.")

    def update_odometer(self,mileage):
        """
        将里程表读数设置为指定值
        禁止将里程表读书往回调
        """
        if mileage >= self.odometer_reading: 
            self.odometer_reading = mileage
        else:
            print("You can't roll back an odometer !")

my_new_car = Car('audi','a4',2016)
print(my_new_car.get_descriptive_name())

my_new_car.odometer_reading = 23        # 1.直接改属性值
my_new_car.read_odometer()

my_new_car.update_odometer(49)          # 2.通过方法修改属性值
my_new_car.read_odometer()



# 9.3 继承

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

    def read_odometer(self):
        print("This car has " + str(self.odometer_reading) + " miles on it")


    def update_odometer(self,mileage):
        # 禁止里程表回调
        if mileage >= self.odometer:
            self.odemeter = mileage

        else:
            print("You can't roll back an odometer !")

    def increment_odometer(self,miles):
        self.odometer_reading += miles

    def fill_gas_tank(self):        # 9.3.4用例
        """油箱"""
        print("zzzz")


class ElectricCar(Car):             # 子类
    """电动汽车的独特之处"""

    def __init__(self,make,model,year):     # 接受创建Car实例所需的信息
        """初始化父类属性"""                # 父类也称为超类(superclass)
        super().__init__(make,model,year)   # super()帮助Python将父类和子类关联起来
        self.battery_size = 70              # 添加一个新属性

    def describe_battery(self):             # 添加一个新方法
        """打印一条描述电瓶容量的消息"""
        print("This car has a " + str(self.battery_size) + "-kwh battery.")

        # 9.3.4 重写父类的方法
        """
        父类的方法,有可能对继承的子类并没有用,则可进行重写
        可在子类定义一个与父类方法同名的方法,调用时Python只关注子类不会关注父类
        """
        # 注:此处""""""注释也需要缩进,不然会报错
        
    def fill_gas_tank(self):
        """电动车没有油箱"""
        print("This car doesn't need a gas tank !")


my_tesla = ElectricCar('tesla','model s',2016)  # 创建一个实例并存储在my_tesla中
print(my_tesla.get_descriptive_name())
my_tesla.describe_battery()



# 9.3.5 将实例用作属性

"""
使用代码模拟食物时,给类添加的细节越多,属性和方法清单就越多,因而可以
将大型的类拆分成多个协同工作的小类

例如:不断给ElectricCar添加细节时,可能会包含汗多针对汽车电瓶的属性和
方法。这种情况下,可以将属性方法提取出来,放到另一个名为Battery的类中
并将一个Battery实例用作ElectricCar类的一个属性

"""

class Car():                 # 父类
    --snip--

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.")

    def get_range(self):
        """打印一条消息,指出电瓶的续航里程"""
        if self.battery_size == 70:
            range = 240
        elif self.battery.size == 85:
            range = 270

        message = "This car can go approximately " + str(range)
        message += " miles on a full charge."
        print(message)

class ElectricCar(Car):     # 每个ElectricCar实例都包含一个自动创建的Battery实例
    """电动汽车的独特之处"""

    def __init__(self,make,model,year):
        """
        初始化父类的属性,再初始化电动汽车特有的属性
        """
        super().__init__(make,model,year)
        # 添加一个self.battery属性,这行代码让Python创建一个新的Battery实例
        self.battery = Battery()        

my_tesla = ElectricCar('tesla','model s',2016)
print(my_tesla.get_descriptive_name())
my_tesla.battery.describe_battery()
my_tesla.battery.get_range()



# 9.4  导入模块,模块中的类
"""一个可用于表示汽车的表"""
# ⬆创建的每个模块都应该编写文档字符串

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

    def read_odometer(self):
        """打印一条消息,指出汽车的里程"""
        print("This car has " + str(self.odometer_reading) + " miles on it")


    def update_odometer(self,mileage):
        # 禁止里程表回调
        if mileage >= self.odometer:
            self.odemeter = mileage
        else:
            print("You can't roll back an odometer !")

    def increment_odometer(self,miles):
        """将里程表读数增加指定的量"""
        self.odometer_reading += miles


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.")

    def get_range(self):
        """打印一条消息,指出电瓶的续航里程"""
        if self.battery_size == 70:
            range = 240
        elif self.battery.size == 85:
            range = 270

        message = "This car can go approximately " + str(range)
        message += " miles on a full charge."
        print(message)


class ElectricCar(Car):     # 每个ElectricCar实例都包含一个自动创建的Battery实例
    """电动汽车的独特之处"""

    def __init__(self,make,model,year):
        """
        初始化父类的属性,再初始化电动汽车特有的属性
        """
        super().__init__(make,model,year)
        # 添加一个self.battery属性,这行代码让Python创建一个新的Battery实例
        self.battery = Battery()        

"""
保存一个名为car.py的模块 内容如上
新建一个py 内容如下
"""

from car import Car      # 文件名 类名

my_new_car = Car('audi','a4',2016)
print(my_new_car.get_descriptive_name())

my_new_car.odometer_reading = 23
my_new_car.read_odometer()

"""
from car import Car,ElectricCar  从一个模块导入多个类

import car                       导入整个模块

from car import *                导入模块中所有类

"""



# 9.5 Python 标准库

from collections import OrderedDict    # 标准库 

fav = OrderedDict()     # 调用 OrderedDict创建一个空的有序字典

fav['jj'] = 'oython'
fav['ss'] = 'cc'
fav['chk'] = 'ruby'

for name,lag in fav.items():
    print(name.title())
    print(lag.title())


from random import randint

x = randint(1,6)    # 返回1-6范围内的一个整数
print(x)



# 9.6 类编码风格
"""
1.类名应采用驼峰命名法,类名每个单词首字母大写,不使用下划线
2.实例名,模块名都应采用小写格式,单词之间加下划线
3.每个类,类定义后应有文档字符串。描述类的功能。
4.每个模块也应有文档字符串,进行作用描述
5.一个空行分隔方法,两个空行分隔类
6.同时调用标准库模块和自己模块时,先导入标准,并添加一个空行

例子如下(不可执行)
"""
from collections import OrderedDict         # 6.标准库中的模块

from car import Car                         # 6.自己定义的模块

class Car():                 
    """一次模拟汽车的简单尝试"""

    def __init__(self,make,model,year):
        self.make = make
                                            # 5.类之间两个空行
        
class CarBattery():                         # 1.类名采用驼峰命名法
    """一次模拟电动汽车电瓶的简单尝试"""    # 3.类后跟文档字符串

    def __init__(self,battery_size=70):
        """初始化电瓶的属性"""              # 4.模块也要有文档字符串
        self.battery_size = battery_size

    def describe_battery(self):             # 2.模块名采用小写下划线
        """打印一条描述电瓶容量的消息"""
        print("This car has a " + str(self.battery_size))




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值