Python学习笔记之【面向对象初步1】2019-08-13

章节号 内容            
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

  这样存在的问题是:我基于此类所产生的对象,全部都是redbenz。如何基于不同的需要,产生不同的colorbrand呢?

  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)与colorbrand相结合。谁调用了方法,即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平方米)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,997评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,603评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,359评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,309评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,346评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,258评论 1 300
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,122评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,970评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,403评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,596评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,769评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,464评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,075评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,705评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,848评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,831评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,678评论 2 354

推荐阅读更多精彩内容