python类的学习


前言

面向对象编程的优势最大的地方是在于可以模拟真实世界,比如将一个物品定义成一个类,此类中可以定义物品的物理属性、比如长、宽、高;还可以在类中定义动作,比如使用方法等。


一、类与实例

示例:先创建一个小狗类,可以表示任何狗狗,后面结合此类来进行类的学习。

Class Dog():
	""" 一次模拟小狗的简单尝试"""
	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!")

这里面有很多疑问的地方:
1.__init__是干啥的,
2.里面的self是啥意思。
3.self.neme.title() 这里面的title()

1.__init__解释

1.首先__init__()是一个方法,类中的函数称为方法;
2.init()是一个特殊的方法,每当根据Dog类创建新实例时,python就会自动运行它。
至于前后两个下划线,是python为了避免与普通的方法冲突。
3.init(self,name, age)此处定义了三个形参:self、name、age(是否可以定义多个形参?应该也是可以的吧)
形参self必不可少,还必须位于其他形参的前面,为何必须在方法定义中包含形参self呢?因为python调用这个__init__()方法来创建Dog实例时,将自动传入实参self。
小总结:init()函数把类本身的属性定义清楚,也叫构造函数。

2.类的实例化

例1:如何建立实例和如何调用类的方法

1.my_dog = Dog('whilie',6)
2.print("My dog's name is" + my_dog.name.title()+'.')
3.print("My dog is"+ str(my_dog.age) + "years old")
4.my_dog.sit()          #调用
5.my_dog.rollover()     #调用

1.上面代码创建了一个Dog类的实例my_dog,python会使用Dog类中的__init__()函数将name:'whilie’和age传给:my_dog()这个实例。
2.其中 title方法是python中字符串函数,返回’标题化‘的字符串,就是单词的开头为大写,其余为小写。 类似的方法有upper()全部大写和lower()全部小写。
3.str()是将数字转换为字符串。

例2:python也有return函数

class Car():
    def __init__(self,make, model, year):
        self.make = make
        self.model = model
        self.year = year
    def get_descriptive_name(self):
        longname = str(self.year)+' '+self.make+' '+self.model
        return longname.title() #python 也有返回函数
 调用:       
 my_car = Car('audi','A4',2016)
 print(my_car.get_descriptive_name())

1.python也有return返回函数

例3:如何对实例的属性进行修改

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):
        longname = str(self.year)+' '+self.make+' '+self.model
        return longname.title()

    def read_odometer(self):
        print('this car has  ' + str(self.odometer_reading) + 'miles on it.')
	def increment_odometer(self,mileage)#此处mileage只是一个形参输入
		self.odometer_reading += mileage
    def update_odometer(self,mileage):#此处mileage只是一个形参输入,
        ''' 禁止调表'''
        if mileage > self.odometer_reading:#odometer_reading才是类的属性。
            self.odometer_reading = mileage
#调用
    my_newcar = Car('audi','a4',2017)
    my_newcar.odometer_reading = 55#直接修改实例的属性
    my_newcar.read_odometer()
    my_newcar.update_odometer(88)#通过方法修改实例的属性。
    my_newcar.read_odometer()      
    my_newcar.increment_odometer(100)#通过方法修改实例的属性
    my_newcar.read_odometer()          

1.实例中以self为前缀的变量可以供类中所有的方法使用,还可以通过类的任何实例来访问这些变量。
2.像这样可以通过实例访问的变量称为属性
3.update_odometer(self,mileage):#此处mileage只是一个形参输入,前面不用加self。

二、类的继承

1.为何有继承的存在
新建一个类后,如果有其他类似的对象,就不需要重新新建一个类,而是借用原来的属性和方法;比如我们上面建立了一个Car类,后面再建立一个电动车的类,就可以借用Car类,因为其基本属性类似。

class Elctric_car(Car):
    def __init__(self, make, model, year):
        super().__init__(make,model,year)
        self.battery_size = 70  #电动车专有属性  只有Elctric_car类有,Car类没有
    def describe_battery(self):
        print("This car has" + str(self.battery_size) + "-kwh battery")
        print(self.make+self.model+str(self.year) + ' '+str(self.battery_size) + "-kwh battery")

2.重写父类的方法
如果子类与父类的方法名称一样,子类创建的实例以子类为最终结果。

    def fill_gas_tunk(self):
        print(“there is no gas tunk in electric cars”)

如果对电动车调用fill_gas_tunk()方法,则会执行上述print函数。
3.将实例用作属性
用代码模拟实物时,可能会发现类添加的细节越来越多,属性和方法越来越长,需要将类的一部分做为一个类提取出来,类似于再次封装。

class Battery():
    def __init__(self, battery_size=70):
        self.battery_size = battery_size
    def describer_battery(self):
        print("this car has" + str(self.battery_size)+"kwh battery")
        
class Elctric_car(Car):
    def __init__(self, make, model, year):
        super().__init__(make,model,year)
        self.battery = Battery()#将实例当作用属性
#调用:
    my_electric_car = Elctric_car('bmw','i8',2021)
    my_electric_car.battery.describer_battery()

三、将类当做模块导入

1.两个py文件,在其中可以将另外一个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):
        longname = str(self.year)+' '+self.make+' '+self.model
        return longname.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
    def increment_odometer(self, mileage):
        self.odometer_reading += mileage
#test_import.py内容如下

from car import Car#意思是从car文件中导入Car类

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

2.还可以直接导入模块

import car

my_tesla = car.Car('tesla', 'roadster', 2019) 

四、总结

python最强大之处就是无比丰富的库资源,我们只要做搭积木的人就好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值