章节号 | 内容 |
---|---|
1图片格式(png) | 宽度大于620px,保持高宽比减低为620px |
1-1 | 应用 |
1-1-1 | 方法 |
VScode按Ctrl+↓,直接跳到下一行编辑
第1章节 类的初步(经典类)
类的基本结构:
calss 类名:
方法
-
1-1 类的初步—定义一个类并创建对象实例
class Car:
def move(self):
print("The car is moving")
car1 = Car()
car1.move()
li@li-ThinkPad-T420s:~/Desktop/py$ The car is moving
1、类名car后必须要加冒号:
2、方法中都必须加上self
参数,同时别忘记冒号:
3、创建对象实例,使用对象名=类名()
方式
4、使用对象名.move()
方式来使用类的move(self)
函数(方法)
1-1-1. 类的初步—定义一个类—为类的对象实例
添加属性
car1.color = "red"
car1.brand = "benz"
print(car1.color)
print(car1.brand)
li@li-ThinkPad-T420s:~/Desktop/py$ red
li@li-ThinkPad-T420s:~/Desktop/py$ benz
1-1-2.类的初步—定义一个类—在类中使用属性
class Car:
def move(self):
print("The car is moving")
def changBlack(self):
self.color="black"
car1 = Car()
car1.move()
car1.color = "red"
car1.brand = "benz"
print(car1.color)
print(car1.brand)
car1.changBlack()
print(car1.color)
The car is moving
red
benz
black
1-1-3.类的初步—定义一个类—在类中初始化属性
class Car:
def move(self):
print("The car is moving")
def changBlack(self):
self.color="black"
#关键在此方法,类似于C++的构造函数
def __init__(self):
self.color = "red"
self.brand = "benz"
car1 = Car()
car1.move()
#car1.color = "red"
#car1.brand = "benz"
print(car1.color)
print(car1.brand)
car1.changBlack()
print(car1.color)
The car is moving
red
benz
black
这样存在的问题是:我基于此类所产生的对象,全部都是red
和benz
。如何基于不同的需要,产生不同的color
和brand
呢?
1-1-4.类的初步—定义一个类—使用参数来初始化不同对象的属性
class Car:
def move(self):
print("The car is moving")
def changBlack(self):
self.color="black"
#在此函数中做手脚,加入两个参数,并把参数的值赋给color和brand
def __init__(self,colorP,brandP):
self.color = colorP
self.brand = brandP
#创建对象时直接把color和brand指明
car1 = Car("red","benz")
car1.move()
print(car1.color)
print(car1.brand)
car1.changBlack()
print(car1.color)
注意一个问题,这里我们并没有显式的调用__init__()
方法,参数也没有传递给__init__()
,而是直接放在了类的()
括号中。当我们这样做的时候,在创建对象的时候python会把参数传递给__init__()
,并且自动调用__init__()
,这是python内部机理。
The car is moving
red
benz
black
1-1-5.类的初步—定义一个类—使用参数来修改属性
class Car:
def move(self):
print("The car is moving")
#在此做手脚
def changBlack(self, colorC):
self.color = colorC
def __init__(self, colorP, brandP):
self.color = colorP
self.brand = brandP
car1 = Car("red", "benz")
car1.move()
print(car1.color)
print(car1.brand)
#调用时直接传入`color`即可
car1.changBlack("black")
print(car1.color)
The car is moving
red
benz
black
1-1-5.类的初步—定义一个类—把外部函数全部集成到类中
class Car:
def move(self):
print("The car is moving")
def changBlack(self, colorC):
self.color = colorC
def __init__(self, colorP, brandP):
self.color = colorP
self.brand = brandP
#添加一个方法,把print函数直接放在了类中
def printAttr(self):
print(self.color)
print(self.brand)
car1 = Car("red", "benz")
car1.move()
#直接调用对象的方法
car1.printAttr()
car1.changBlack("black")
#直接调用对象的方法
car1.printAttr()
The car is moving
red
benz
black
benz
-
1-2 类的初步—把对象当做参数进行传递
刚才我们把全部外部的函数(实际也就只有print)全部集成到了类定义当中,类定义体之外全部都是对象名.
的方式来调用方法。
现在我们在类定义之外,定义一个函数:
class Car:
def move(self):
print("The car is moving")
def changBlack(self, colorC):
self.color = colorC
def __init__(self, colorP, brandP):
self.color = colorP
self.brand = brandP
def printAttr(self):
print(self.color)
print(self.brand)
#定义一个外部(相对于类的内部而言)函数,函数有一个obj参数,函数体内obj调用了类的内部方法
def outFunction(obj):
obj.printAttr()
car1 = Car("red", "benz")
#调用时传递了一个对象给outFunction
outFunction(car1)
red
benz
突然想到的一个问题,证明不同对象之间的的属性是独享,方法是共享:
class Car:
def move(self):
print("The car is moving")
def changBlack(self, colorC):
self.color = colorC
def __init__(self, colorP, brandP):
self.color = colorP
self.brand = brandP
def printAttr(self):
print(self.color)
print(self.brand)
def outFunction(obj):
obj.printAttr()
print(id(obj))
print(id(obj.printAttr))
car1 = Car("red", "benz")
outFunction(car1)
car2 = Car("blue", "bmw")
outFunction(car2)
red
benz
140134156651824
140134156412744
blue
bmw
140134156651992
140134156412744
1-2-1. 类的初步—把对象当做参数进行传递—self是什么
当一个类的对象实例化的时候(如下图):
car1 = Car("red", "benz")
python将为car1分配一片地址空间,并将该空间的地址
传递给类的__init__
方法中的self
def __init__(self, colorP, brandP):
self.color = colorP
self.brand = brandP
这样就将地址
(即代表car1)与color
和brand
相结合。谁调用了方法,即who.printAttr(self),self==who!
-
1-3 类的初步—魔法方法(类似于 __name__() )
首先我们看如果直接打印一个对象会发生什么:
car1 = Car("red", "benz")
print(car1)
<__main__.Car object at 0x7f1f5d8c9be0>
可以看到输出的是一个地址,但是这个地址的输入似乎对程序的使用者没有太大的意义,那么如何能在直接打印一个对象的时候输入一些有意义的信息呢?
我们可以定义一个__str__()
方法来完成:
def __str__(self):
return ("i am "+self.brand)
car1 = Car("red", "benz")
print(car1)
i am abenz
retuen 什么内容,打印对象就显示什么内容
第2章节 类的初步之编程应用:游戏编写
-
1-1 类的初步之编程应用—游戏编写
第3章节 类的初步之编程应用:游戏编写
贴一段为学习而写的代码,方便以后继续改进修改(使用VScode)。知识点:对象中再保存其他对象。
其实保存的只是地址,而不是全部数据。
class Home:
def __init__(self, mianji):
self.mianji = mianji
self.jiajuList = []
def __str__(self):
jiaju = ""
for t in self.jiajuList:
if jiaju == "":
jiaju = t.leixing
else:
jiaju = jiaju+", "+t.leixing
jiaju = jiaju + "(占地面积"+str(t.mianji)+"平方米)"
msg = "我的家面积是120平方米,放了家具还有"+str(self.mianji)+"平方米的空间===.现在的家具有:"+jiaju
return msg
def banjiaju(self, obj):
if (self.mianji >= obj.mianji):
self.jiajuList.append(obj)
self.mianji = self.mianji - obj.mianji
else:
print("放不下了")
class Bed:
def __init__(self, mianji, leixing):
self.mianji = mianji
self.leixing = leixing
def __str__(self):
msg = "床的面积是:"+str(self.mianji)+".类型是:"+self.leixing
return msg
home = Home(120)
bed = Bed(20, "ximengsi")
print(home)
print(bed)
home.banjiaju(bed)
print(home)
bed2 = Bed(18, "gangsichaung")
print(bed2)
home.banjiaju(bed2)
print(home)
bed3 = Bed(83, "taikongchuang")
print(bed3)
home.banjiaju(bed3)
print(home)
我的家面积是120平方米,放了家具还有120平方米的空间===.现在的家具有:
床的面积是:20.类型是:ximengsi
我的家面积是120平方米,放了家具还有100平方米的空间===.现在的家具有:ximengsi(占地面积20平方米)
床的面积是:18.类型是:gangsichaung
我的家面积是120平方米,放了家具还有82平方米的空间===.现在的家具有:ximengsi(占地面积20平方米), gangsichaung(占地面积18平方米)
床的面积是:83.类型是:taikongchuang
放不下了
我的家面积是120平方米,放了家具还有82平方米的空间===.现在的家具有:ximengsi(占地面积20平方米), gangsichaung(占地面积18平方米)