【初学python第8天】——类

本文介绍了Python中的面向对象编程概念,包括如何创建和使用类来表示对象,如Dog和Car类的示例。类的初始化方法`__init__`用于设置实例属性,如Car类的make、model和year。文章还讨论了如何直接或通过方法修改实例属性,以及通过继承实现子类,如ElectricCar继承自Car类。此外,还提到了导入类和模块的机制。
摘要由CSDN通过智能技术生成

9.类

面向对象的。类可用于创建和表示对象,编写类后可以创建表示特定对象的实例。

9.1创建类与实例

class Dog():
	'''模拟小狗'''
	def _init_(self,name,age):
		'''初始化属性'''
		self.name =name
		self.age=age

类的首字母大写(如Dog),小写的名称(如my_dog)指的是根据类创建的实例。类中的函数成为方法。
方法__init__()是一个特殊的方法,每当你根据Dog类创建新实例时,Python都会自动运行它。在这个方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在避免Python默认方法与普通方法发生名称冲突
每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。

9.2 使用类和实例

  1. 使用默认值
class Car():
    def __init__(self,make,model,year):
        '''初始化汽车的属性'''
        self.make = make
        self.model = model
        self.year = year
        self.odometer_reading = 0

    def get_description_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.')

my_car = Car('audi','a4',2016)
print(my_car.get_description_name())
my_car.read_odometer()
  1. 修改属性的值
    3.1 直接通过实例修改
    通过实例直接访问该属性并设置
    例如my_car.odometer_reading = 23
    3.2 通过方法进行设置
    无需访问属性,使用方法更新属性
class Car():
...snip...

    def update_odometer(self,mileage):
        '''更新里程,禁止里程表回调'''
                if mileage > self.odometer_reading:
            self.odometer_reading = mileage
        else:
            print('不能修改')
            
my_car.update_odometer(23)
3.3  通过方法递增

需要将属性值递增特定的量

    def increment_odometer(self,miles):
        '''将里程表增加特定的量'''
        self.odometer_reading +=miles

练习9_5

class User():
    def __init__(self,first_name,last_name):
        self.first_name = first_name
        self.last_name = last_name
        self.login_attempts = 0

    def describe_user(self):
        print(self.first_name+self.last_name)

    def greet_user(self):
        full_name = self.first_name+self.last_name
        print('hello '+full_name)
    def increment_login_attempts(self):
        '''将属性登录次数增加1'''
        self.login_attempts += 1

    def reset_login_attempts(self):
        '''将属性登录次数重置为0'''
        self.login_attempts = 0


jack = User('jack','kadan')
jack.describe_user()
jack.greet_user()
jack.increment_login_attempts()
print(jack.login_attempts)
jack.reset_login_attempts()
print(jack.login_attempts)

9.3 继承

子类继承父类的所有属性和方法,同时还可以定义自己的属性和方法。父类是原有的类,新类称为子类。

  1. 子类的方法_init_()
class ElectricCar(Car):
    '''电动汽车的独特之处'''
    def __init__(self,make,model,year):
        '''初始化父类的属性'''
        super()._init_(make,model,year)

创建子类时,父类必须包含在当前文件,且位于子类的前面。
定义子类时,必须在括号内指定父类的名称。
函数==super()==关联父类与子类,代码行 super()._init_(make,model,year) 使程序调用父类的方法_init_(),让ElectricCar包含父类的所有属性。

  1. 给子类定义属性与方法
class ElectricCar(Car):
    '''电动汽车的独特之处'''
    def __init__(self,make,model,year):
        '''初始化父类的属性'''
        super(ElectricCar, self).__init__(make,model,year)
        self.battery_size = 70

    def describe_battery(self):
        print('This car has a '+str(self.battery_size)+'-kwh battery.')


my_tesla = ElectricCar('tesla','model s',2016)
my_tesla.describe_battery()
  1. 重写父类的方法
    在子类中定义一个同名方法,在调用时,Python会调用子类的方法定义,即子类会覆盖父类的同名方法。

  2. 将实例用作属性
    将类的一部分提取出来作为一个独立的类,例如电动汽车里的电池可以单独做一个类Battery

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):
        '''初始化父类的属性'''
        super(ElectricCar, self).__init__(make,model,year)
        self.battery = Battery() #==创建一个Battery实例==


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

描述电瓶时需要使用属性battery,代码行为my_tesla.battery.describe_battery()
在ElectricCar类中,self.battery = Battery()创建一个Battery实例并将其存储在属性battery中
即每个ElectricCar实例都包含一个Battery实例。

9.4 导入类

将类存储在模块中,并在主程序中导入需要的模块。
当我们导入一个模块时,Python 解释器会执行该模块的所有顶层代码(即非函数或类定义等,直接执行的代码),这些代码包括变量初始化、函数定义、类定义以及运行顶层可执行代码等。这些代码都会在模块导入时执行,因此在导入模块时,它们也会被执行。
如果希望只导入模块中的特定代码而不运行其他代码,可以考虑将这些代码定义到函数或类中,并在需要时手动调用它们。这样可以避免自动运行其他不需要的代码。
导入模块中的类 from model import class1,class2
导入模块中所有的类from model import *
导入整个模块import model

from random import randint
class Die():
    def __init__(self,sides):
        '''类的属性'''
        self.sides = 6

    def roll_die(self):
        '''扔骰子10次'''
        numbers = []
        count = 0
        while count < 10:
            numbers.append(randint(1, self.sides))
            count += 1
        print(numbers)


x = Die(6)
x.roll_die()
y = Die(10)
y.roll_die()

出现错误TypeError: Die() takes no arguments 检查方法__init__()下划线是两个
Python Module of the Week:要了解Python标准库,一个很不错的资源是网站Python Module of the Week。请访问http://pymotw.com/
在类中,可使用一个空行来分隔方法;而在模块中,可使用两个空行来分隔类。
需要同时导入标准库中的模块和你编写的模块时,先编写导入标准库模块的import语句,再添加一个空行,然后编写导入你自己编写的模块的import语句。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值