类和对象全解1(python)

  1. 类(Class)由三个部分构成
    1)类的名称:类名
    2)类的属性:一组数据
    3)类的方法:允许对进行操作的方法(行为)
  2. 举例:
    1)人类设计
    事物名称(类名):人(Person)
    属性:身高(height),年龄(age)
    方法(行为/功能):跑(run),打架(fight)
    2)狗类的设计
    类名:狗(Dog)
    属性:品种,毛色,性别,名字,腿的数量
    方法(行为/功能):叫,跑,咬人,吃,摇尾巴
  3. 添加属性,多个对象
class Cat:
    #属性

    #方法
    def eat(self):
        print("Cat is eating fish.")

    def drink(self):
        print("Cat is drinking water.")

    def introduce(self):
        print("%s的年龄是:%d" % (tom.name, tom.age))

#创建一个对象
tom = Cat()

#调用tom指向的对象中的方法
tom.eat()
tom.drink()

#属性就是变量
#给tom指向的对象添加2个属性
tom.name = "汤姆"
tom.age = 40

#获取属性的第一种方法
#print("%s的年龄是:%d" % (tom.name, tom.age))

tom.introduce()

lanmao = Cat()
lanmao.name = "蓝猫"
lanmao.age = 10
lanmao.introduce()
/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/xinqi/PycharmProjects/test/test.py
Cat is eating fish.
Cat is drinking water.
汤姆的年龄是:40
汤姆的年龄是:40

Process finished with exit code 0

此处发现,lanmao()调用的依旧是tom.name, tome.age的值,那么如何让lanmao()调用自己的变量?如图所示流程图


self的用法
class Cat:
    #属性

    #方法
    def eat(self):
        print("Cat is eating fish.")

    def drink(self):
        print("Cat is drinking water.")

    def introduce(self):
        #print("%s的年龄是:%d" % (tom.name, tom.age))
        print("%s的年龄是:%d" % (self.name, self.age))

#创建一个对象
tom = Cat()

#调用tom指向的对象中的方法
tom.eat()
tom.drink()

#属性就是变量
#给tom指向的对象添加2个属性
tom.name = "汤姆"
tom.age = 40

#获取属性的第一种方法
#print("%s的年龄是:%d" % (tom.name, tom.age))

tom.introduce() #相当于tom.introduce(tom)

lanmao = Cat()
lanmao.name = "蓝猫"
lanmao.age = 10
lanmao.introduce()
#如图所示,只需要将introduce()里面改成self.name, self.age就可以解决问题了
#self所起的作用就是谁调用就指向谁
Cat is eating fish.
Cat is drinking water.
汤姆的年龄是:40
蓝猫的年龄是:10
  1. "__init __"的用法
class Cat:
    """定义了一个Cat类"""

    #初始化对象
    def __init__(self):
        print("---haha---")

    #方法
    def eat(self):
        print("Cat is eating fish.")

    def drink(self):
        print("Cat is drinking water.")

    def introduce(self):
        print("%s的年龄是:%d" % (self.name, self.age))

#创建一个对象
tom = Cat()

tom.eat()
tom.drink()
tom.name = "汤姆"
tom.age = 40
tom.introduce()

lanmao = Cat()
lanmao.name = "蓝猫"
lanmao.age = 10
lanmao.introduce()
/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/xinqi/PycharmProjects/test/test.py
---haha---
Cat is eating fish.
Cat is drinking water.
汤姆的年龄是:40
---haha---
蓝猫的年龄是:10

Process finished with exit code 0

创建对象,调用__init __方法

class Cat:
    """定义了一个Cat类"""

    #初始化对象
    def __init__(self, new_name, new_age):
        self.name = new_name
        self.age = new_age

    #方法
    def eat(self):
        print("Cat is eating fish.")

    def drink(self):
        print("Cat is drinking water.")

    def introduce(self):
        print("%s的年龄是:%d" % (self.name, self.age))

#创建一个对象
tom = Cat("汤姆", 40)
#tom = Cat()

tom.eat()
tom.drink()
#tom.name = "汤姆"
#tom.age = 40
tom.introduce()

#lanmao = Cat()
lanmao = Cat("蓝猫", 10)
#lanmao.name = "蓝猫"
#lanmao.age = 10
lanmao.introduce()

这个程序中,可以直接在tom = Cat()和lanmao = Cat里面赋值,将"汤姆""蓝猫"赋值给new_name,将40, 10赋值给new_age,每次创建两个不同的对象,之后调用__init __()方法,最后返回这个对象的引用

/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/xinqi/PycharmProjects/test/test.py
Cat is eating fish.
Cat is drinking water.
汤姆的年龄是:40
蓝猫的年龄是:10

Process finished with exit code 0
  1. "__str __"方法的作用


    调用__str__方法.png
class Cat:
    """定义了一个Cat类"""

    #初始化对象
    def __init__(self, new_name, new_age):
        self.name = new_name
        self.age = new_age

    def __str__(self):
        return "%s的年龄是:%d" % (self.name, self.age)

    #方法
    def eat(self):
        print("Cat is eating fish.")

    def drink(self):
        print("Cat is drinking water.")

    def introduce(self):
        print("%s的年龄是:%d" % (self.name, self.age))

#创建一个对象
tom = Cat("汤姆", 40)

lanmao = Cat("蓝猫", 10)

print(tom)
print(lanmao)
/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/xinqi/PycharmProjects/test/test.py
汤姆的年龄是:40
蓝猫的年龄是:10

Process finished with exit code 0
  1. 烤地瓜程序
"""烤地瓜程序"""
"""示例属性如下"""
#cookedLevel: 0~3表示还是生的,超过3表示半生不熟,超过5表示已经烤好了,超过8表示已经烤成木炭了
#地瓜开始的时候是生的
#cookedString: 这是字符串,描述地瓜的生熟程度
#condiments: 这是地瓜的配料列表,比如蕃茄酱、芥末酱等

class SweetPotato:

    def __init__(self):
        self.cookedString = "生的"
        self.cookedLevel = 0

    def __str__(self):
        return "地瓜 状态:%s(%d)" % (self.cookedString, self.cookedLevel)

    def cook(self, cooked_time):
        if cooked_time >= 0 and cooked_time < 3:
            self.cookedString = "生的"
        elif cooked_time >= 3 and cooked_time < 5:
            self.cookedString = "半生不熟"
        elif cooked_time >= 5 and cooked_time < 8:
            self.cookedString = "熟了"
        elif cooked_time > 8:
            self.cookedString = "烤糊了"


#创建了一个地瓜对象
di_gua = SweetPotato()

#开始烤地瓜
di_gua.cook(1)
print(di_gua)
di_gua.cook(1)
print(di_gua)
di_gua.cook(1)
print(di_gua)
di_gua.cook(1)
print(di_gua)
di_gua.cook(1)
print(di_gua)
/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/xinqi/PycharmProjects/test/test.py
地瓜 状态:生的(0)
地瓜 状态:生的(0)
地瓜 状态:生的(0)
地瓜 状态:生的(0)
地瓜 状态:生的(0)

Process finished with exit code 0

此处我们发现,结果并没有累加上去,跟我们预期的每次烤一分钟,五次就是烤了五分钟的结果不一样,那么如何改进呢?

"""烤地瓜程序"""
"""示例属性如下"""
#cookedLevel: 0~3表示还是生的,超过3表示半生不熟,超过5表示已经烤好了,超过8表示已经烤成木炭了
#地瓜开始的时候是生的
#cookedString: 这是字符串,描述地瓜的生熟程度
#condiments: 这是地瓜的配料列表,比如蕃茄酱、芥末酱等

class SweetPotato:

    def __init__(self):
        self.cookedString = "生的"
        self.cookedLevel = 0

    def __str__(self):
        return "地瓜 状态:%s(%d)" % (self.cookedString, self.cookedLevel)

    def cook(self, cooked_time):

        self.cookedLevel += cooked_time

        if self.cookedLevel >= 0 and self.cookedLevel < 3:
            self.cookedString = "生的"
        elif self.cookedLevel >= 3 and self.cookedLevel < 5:
            self.cookedString = "半生不熟"
        elif self.cookedLevel >= 5 and self.cookedLevel < 8:
            self.cookedString = "熟了"
        elif self.cookedLevel > 8:
            self.cookedString = "烤糊了"


#创建了一个地瓜对象
di_gua = SweetPotato()

#开始烤地瓜
di_gua.cook(1)
print(di_gua)
di_gua.cook(1)
print(di_gua)
di_gua.cook(1)
print(di_gua)
di_gua.cook(1)
print(di_gua)
di_gua.cook(1)
print(di_gua)
di_gua.cook(1)
print(di_gua)
di_gua.cook(1)
print(di_gua)
di_gua.cook(1)
print(di_gua)
di_gua.cook(1)
print(di_gua)
di_gua.cook(1)
print(di_gua)
di_gua.cook(1)
print(di_gua)
/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/xinqi/PycharmProjects/test/test.py
地瓜 状态:生的(1)
地瓜 状态:生的(2)
地瓜 状态:半生不熟(3)
地瓜 状态:半生不熟(4)
地瓜 状态:熟了(5)
地瓜 状态:熟了(6)
地瓜 状态:熟了(7)
地瓜 状态:熟了(8)
地瓜 状态:烤糊了(9)
地瓜 状态:烤糊了(10)
地瓜 状态:烤糊了(11)

Process finished with exit code 0

添加佐料

"""烤地瓜程序"""
"""示例属性如下"""
#cookedLevel: 0~3表示还是生的,超过3表示半生不熟,超过5表示已经烤好了,超过8表示已经烤成木炭了
#地瓜开始的时候是生的
#cookedString: 这是字符串,描述地瓜的生熟程度
#condiments: 这是地瓜的配料列表,比如蕃茄酱、芥末酱等

class SweetPotato:

    def __init__(self):
        self.cookedString = "生的"
        self.cookedLevel = 0
        self.condiments = []

    def __str__(self):
        return "地瓜 状态:%s(%d),添加的佐料有:%s" % (self.cookedString, self.cookedLevel, str(self.condiments))

    def cook(self, cooked_time):

        self.cookedLevel += cooked_time

        if self.cookedLevel >= 0 and self.cookedLevel < 3:
            self.cookedString = "生的"
        elif self.cookedLevel >= 3 and self.cookedLevel < 5:
            self.cookedString = "半生不熟"
        elif self.cookedLevel >= 5 and self.cookedLevel < 8:
            self.cookedString = "熟了"
        elif self.cookedLevel > 8:
            self.cookedString = "烤糊了"

    def addCondiments(self, item):
        self.condiments.append(item)


#创建了一个地瓜对象
di_gua = SweetPotato()

#开始烤地瓜
di_gua.cook(1)
print(di_gua)
di_gua.cook(1)
print(di_gua)
di_gua.cook(1)
di_gua.addCondiments("Garlic")
print(di_gua)
di_gua.cook(1)
print(di_gua)
di_gua.cook(1)
di_gua.addCondiments("Pepper")
print(di_gua)
di_gua.cook(1)
print(di_gua)
di_gua.cook(1)
di_gua.addCondiments("Butter")
print(di_gua)
di_gua.cook(1)
print(di_gua)
di_gua.cook(1)
di_gua.addCondiments("Ketchup")
print(di_gua)
di_gua.cook(1)
print(di_gua)
di_gua.cook(1)
print(di_gua)
/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/xinqi/PycharmProjects/test/test.py
地瓜 状态:生的(1),添加的佐料有:[]
地瓜 状态:生的(2),添加的佐料有:[]
地瓜 状态:半生不熟(3),添加的佐料有:['Garlic']
地瓜 状态:半生不熟(4),添加的佐料有:['Garlic']
地瓜 状态:熟了(5),添加的佐料有:['Garlic', 'Pepper']
地瓜 状态:熟了(6),添加的佐料有:['Garlic', 'Pepper']
地瓜 状态:熟了(7),添加的佐料有:['Garlic', 'Pepper', 'Butter']
地瓜 状态:熟了(8),添加的佐料有:['Garlic', 'Pepper', 'Butter']
地瓜 状态:烤糊了(9),添加的佐料有:['Garlic', 'Pepper', 'Butter', 'Ketchup']
地瓜 状态:烤糊了(10),添加的佐料有:['Garlic', 'Pepper', 'Butter', 'Ketchup']
地瓜 状态:烤糊了(11),添加的佐料有:['Garlic', 'Pepper', 'Butter', 'Ketchup']

Process finished with exit code 0
  1. 存放家具程序
    这个程序的目的是把一个对象放到另一个对象里面去
class Home:
    def __init__(self, new_area, new_info, new_addr):
        self.area = new_area
        self.info = new_info
        self.addr = new_addr
        self.left_area = new_area
        self.contain_items = []

    def __str__(self):
        msg = "房子的总面积是:%d,可用面积是:%d, 户型是:%s,地址是:%s" % (self.area, self.left_area, self.info, self.addr)
        msg += " 当前房子里的物品有%s" % str(self.contain_items)
        return msg

    def add_item(self, item):
        self.left_area -= item.area
        self.contain_items.append(item.name)

class Bed:
    def __init__(self, new_name, new_area):
        self.name = new_name
        self.area = new_area

    def __str__(self):
        return "%s占用的面积是:%d" % (self.name, self.area)


house = Home(129, "三室一厅", "Sydney")
print(house)

bed1 = Bed("席梦思", 4)
print(bed1)

house.add_item(bed1)
print(house)

bed2 = Bed("三人床", 6)
house.add_item(bed2)
print(house)
/Library/Frameworks/Python.framework/Versions/3.6/bin/python3.6 /Users/xinqi/PycharmProjects/test/test.py
房子的总面积是:129,可用面积是:129, 户型是:三室一厅,地址是:Sydney 当前房子里的物品有[]
席梦思占用的面积是:4
房子的总面积是:129,可用面积是:125, 户型是:三室一厅,地址是:Sydney 当前房子里的物品有['席梦思']
房子的总面积是:129,可用面积是:119, 户型是:三室一厅,地址是:Sydney 当前房子里的物品有['席梦思', '三人床']

Process finished with exit code 0

这个程序还可以做进一步的改进

class Home:
    def __init__(self, new_area, new_info, new_addr):
        self.area = new_area
        self.info = new_info
        self.addr = new_addr
        self.left_area = new_area
        self.contain_items = []

    def __str__(self):
        msg = "房子的总面积是:%d,可用面积是:%d, 户型是:%s,地址是:%s" % (self.area, self.left_area, self.info, self.addr)
        msg += " 当前房子里的物品有%s" % str(self.contain_items)
        return msg

    def add_item(self, item):
        self.left_area -= item.get_area()
        self.contain_items.append(item.get_name())
        #self.left_area -= item.area
        #self.contain_items.append(item.name)

class Bed:
    def __init__(self, new_name, new_area):
        self.name = new_name
        self.area = new_area

    def __str__(self):
        return "%s占用的面积是:%d" % (self.name, self.area)

    def get_area(self):
        return self.area

    def get_name(self):
        return self.name

house = Home(129, "三室一厅", "Sydney")
print(house)

bed1 = Bed("席梦思", 4)
print(bed1)

house.add_item(bed1)
print(house)

bed2 = Bed("三人床", 6)
house.add_item(bed2)
print(house)

此时可以对item.area和item.name进行一个封装,因为这样可以保证信息的安全行,而不至于别人想调用自己的item.area就可以直接看到我自己的数据。具体可以用一个get_area()和item.get_name()函数调用一下,并且在Bed的class里面定义这两个函数。

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

推荐阅读更多精彩内容