python学习笔记>面向对象式编程

创建和使用类

面向对象式编程中,创建类可以模拟许多对象
这里我们以创建Dog类为例

 class Dog:
    """A simple attempt to model a dog."""  
  
    def __init__(self, name, age):
        """Initialize name and age attributes."""
        self.name = name
        self.age = age
        
    def sit(self):
        """Simulate a dog sitting in response to a command."""
        print(f"{self.name} is now sitting.")

    def roll_over(self):
        """Simulate rolling over in response to a command."""
        print(f"{self.name} rolled over!")


用Dog类模拟狗的一些特性,输出狗的名字
_init_()
类中的函数称为方法,上面代码中的方法是一种特殊方法,当根据Dog类创建新实例的时候,python会自动运行它,注意这个方法的名称前后都有两个下划线,这是为了区分其他的方法,所以使用这个方法的时候无比确保名称书写正确,否则导致程序错误。
__init__方法定义包含三个形参:self,name,age.在这个方法的定义中,self十分重要,必须位于其它形参的前面。python调用这个方法创建Dog实例的时候,将自动传入实参self,每个于实例相关联的方法调用都将自动传递实参self,他是一个指向实例本身的引用,让实例能够访问类中的属性和方法。在类中的其它自定义函数中也要引入形参self
self.name定义的两个变量都有以self为前缀,以self为前缀的变量可以供类中的所有方法使用,可以通过类的任何实例访问。self.name=name可以可以获取于name相关的值,并将其赋给变量name,这样可以通过实例访问的变量成为实例

根据类创建实例

my_dog = Dog('Willie', 6)
your_dog = Dog('Lucy', 3)

print(f"My dog's name is {my_dog.name}.")
print(f"My dog is {my_dog.age} years old.")
my_dog.sit()

print(f"\nYour dog's name is {your_dog.name}.")
print(f"Your dog is {your_dog.age} years old.")
your_dog.sit()

使用类是通常将类名称写为大写,类创建的实例写为小写
1.访问属性
my_dog.name
在实例中,使用实例名称.变量来访问实例的属性;而在类中,则改为类名称。
2.调用方法
my_dog.sit()
3.创建多个实例
my_dog = Dog('Willie', 6)
your_dog = Dog('Lucy', 3)
重复该语法

使用类和实例

Car类

class Car:
    """A simple attempt to represent a car."""

    def __init__(self, make, model, year):
        """Initialize attributes to describe a car."""
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0  指定默认值
        
    def get_descriptive_name(self):
        """Return a neatly formatted descriptive name."""
        long_name = f"{self.year} {self.make} {self.model}"
        return long_name.title()

my_new_car = Car('subaru', 'outback', 2015)
print(my_new_car.get_descriptive_name())

给属性指定默认值

创建实例时,有些属性无需通过形参定义,可以在__init__()中为其指定默认值(见代码框)

修改属性的值

1.直接修改属性的值

my_new_car = Car('subaru', 'outback', 2015)
print(my_new_car.get_descriptive_name())

my_new_car.odometer_reading = 23  修改属性的值

2.通过方法修改属性的值

class Car():
--snip--

    def update_odometer(self, mileage): 
        """将里程表读数设置为指定的""" 
        self.odometer_reading = mileage

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

my_new_car.update_odometer(23) 
my_new_car.read_odometer()

这里定义了update_odometer()的方法来更新属性的值
3.通过方法对属性的值进行递增

class Car():
--snip--

    def update_odometer(self, mileage):
--snip--

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

my_used_car = Car('subaru', 'outback', 2013) 
print(my_used_car.get_descriptive_name())

my_used_car.update_odometer(23500) my_used_car.read_odometer()
my_used_car.increment_odometer(100) my_used_car.read_odometer()

继承

如果要编写的类时另一个现成类的特殊版本,可使用继承。一个类继承另一个类。自动获得另一个类的所有属性和方法。原有的类称为父类。子类继承父类的属性和方法,同时,子类可以定义自己的属性和方法。

子类的方法__init__()

编写新类时,要调用父类的__init__()方法

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 i")
    
    def update_odometer(self, mileage):
        if mileage >= self.odometer_reading: 
            self.odometer_reading =     mileage
        else:
            print("You can't roll back an odometer!")
    
    def increment_odometer(self, miles): 
        self.odometer_reading += miles

class ElectricCar(Car):
"""电动汽车的独特之处"""
    def __init__(self, make, model, year):
         """初始化父类的属性"""
        super().  init  (make, model, year)


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

创建子类时,父类必须包含在当前文件夹,即父类在前面。定义子类时,圆括号类要指定父类的名称。super()是一个特殊的函数,让你能够调用父类的方法

导入类

导入单个类

在同一个文件夹下创建两个文件,其中car.py用于存储Car类,另一个my_car.py用于存储实例代码
car.py:

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!")
    
    def increment_odometer(self, miles): 
        """将里程表读数增加指定的量""" 
        self.odometer_reading += miles

在这个文件中,较为完整的囊据了Car类的属性以及方法
my_car.py

from car import Car

my_new_car = Car('audi', 'a4', 2016) 
print(my_new_carget_descriptive_name())

my_new_car.odometer_reading = 23
my_new_car.read_odometer()

这个文件的第一句导入了Car类模块

在一个模块中存储多个类

"""一组用于表示燃油汽车和电动汽车的类"""

class Car():
--snip--

class Battery():
    """一次模拟电动汽车电瓶的简单尝试"""
    def   init  (self, battery_size=60): 
        """初始化电瓶的属性""" 
        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):
    """模拟电动汽车的独特之处"""
    def __init__(self, make, model, year): 
        """初始化父 类的属性,再初始化电动汽车特有的属性"""
        super().__init__(make, model, year) 
        self.battery = Battery()

从一个模块中导入多个类

from car import Car,ElectricCar

导入整个模块

import car

导入模块中的所有类

from model_name import *

此方法不建议

使用别名

from car import Car as other_name
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值