python中的类和对象

#!usr/bin/env python  
#-*- coding:utf-8 _*-  
'''
所有步骤从头到尾逐步实现
根据开发的功能将某些代码封装成一个有一个函数
面向过程就是顺序的执行不同的函数
面向过程比较复杂,不适合复杂的项目
'''

'''
面向对象的侧重点是---------谁来做事情
根据职责确定不同的对象,在对象内部封装各自不同的方法
各个对象的方法很少会相互调用的
最后完成的代码,就是顺序的让不同的对象调用不同的方法

专门应对复杂项目,提供套路

'''

'''
类:
制造飞机使用的图纸
   它可以指定飞机具有怎样的属性和特征
   特征:属性------------用来描述类的特征的
   行为:方法------------可以动的
   
   类是一个模板,对象是根据模板对象创建出来的,应该先有类,再有对象
   类只有一个,但是对象可以有很多个
   不同的对象之间属性,可能各不相同
   类中定义有什么样的对象和方法,对象就有什么样的属性和方法。
   开发之前,要明确程序中要包含哪些类?
   在给类起名字的时候要满足大驼峰命名法
   
   类的三要素
   类名:名词提炼法,分析整个业务,出现的名词,通常就是要找到的类
   属性;对对象的描述
   方法:对象具有的行为,通常定义成方法(动词
   
   
   使用面向对象开发之前一定要先分析)
'''
# 面向对象的基本语法
# dir 内置函数:可以查看针对这个对象所有的属性和方法

def demo():
    print("bububu")
demo()


# __方法名__这样的格式语法他是python提供的内置方法/ 属性,记不住的时候就用dir()查一下

'''
在python中定义类
class 类名:
    def 方法1(self,参数列表):
         pass
    def 方法2(self,参数列表):
         pass
         
方法定义的格式与之前学习的函数定义几乎完全一样,区别仅在于方法的第一个参数必须是self
'''
'''
class Cat:#创建了一个对象
    def eat(self):#定义了一个方法
        print("eat fish")

    def drink(self):#又定义了一个方法
        print("like drink water")

tom=Cat()#创建了一个tom对象--------------创建对象的实质是什么呢?在内存中开辟了一个空间
tom.eat()#这个对象来调用两个方法
tom.drink()
'''

# 在面向对象中,引用的概念同样适用
# class Cat:#创建了一个对象
#     def eat(self):#定义了一个方法
#         print("eat fish")
#
#     def drink(self):#又定义了一个方法
#         print("like drink water")
#
# tom=Cat()
# tom.name="Tom"#临时增加一个属性,这个方法不推荐使用
# tom.eat()
# tom.drink()

# tom和lazy_cat是两只猫
# 使用相同的类创建不同的对象
# lazy_cat=Cat()
# lazy_cat.eat()
# lazy_cat.drink()
# lazy_cat2=lazy_cat#这俩是同一只猫,所以

# class Cat:#创建了一个对象
#     def eat(self):#定义了一个方法
#         print("%s eat fish"%self.name)
#
#     def drink(self):#又定义了一个方法
#         print("%s like drink water"%self.name)
#
# tom=Cat()
# tom.name="Tom"#虽然很方便,但是开发中并不经常使用在类的外部添加属性
# # 对象包含哪些属性,应该封装在类的内部
# tom.eat()
# tom.drink()


'''
 当使用类名创建对象时,会自动执行以下操作;
1.为对象在内存中分配空间----创建对象
2.为对象的属性设置初始值-----初始化init方法
__init__方法是专门用来定义一个类具有哪些属性的
使用类名创建对象的时候,会自动调用__init__()方法
在初始化方法中定义属性
self.属性名=属性值
'''

'''
class Cat:
    def __init__(self,new_name):
        print("这是一个初始化方法")
        # self.name="TOM"#编写代码的时候是有智能提示的,不希望把名字固定死,可以增加一个形参,然后传值
        self.name=new_name#增加一个形参,这样就可以随意传值
    def est(self):
        print("%s like eat fish"%self.name)#初始化方法定义的name全部的地方都可以使用

tom=Cat("tom")
tom.est()
print(tom.name)#这里输出的是tom的初始值
lazy_cat=Cat("大懒猫")
lazy_cat.est()

改造初始化方法
在开发中,若希望在创建对象的同时,就设置对象的属性,可以对__init__方法进行改造
1.把希望设置的属性值定义成__init__方法的参数
2.方法内部使用self.属性名=形参 接收外部传递的参数
3.在创建对象的时候,使用类名(属性1,属性2,属性3...)调用
'''
'''
__del__它也是一个内置方法
'''

# class Cat:
#     def __init__(self,name):
#         self.name=name
#         print("%s l come"%name)
#     def __del__(self):
#         print("%s l go"%self.name)
#  # tom是一个全局变量
# tom=Cat("TOM")
# print(tom.name)
#
# del 关键字可以调用__del__方法
'''
生命周期
一个对象从调用类名()开始创建,生命周期开始
一个对象的__del__方法一旦被调用生命周期结束
在对象的生命周期内可以访问对象的属性,或者让对象调用方法
'''

'''
__str__方法
若在开发中,若希望print输出变量内容的时候能够打印自定义的内容,可以利用这个内置方法
但是这个方法的返回值必须是字符串类型
'''
# class Cat:
#     def __init__(self,name):
#         self.name=name
#         print("%s l come"%name)
#     def __del__(self):
#         print("%s l go"%self.name)
#
#     def __str__(self):
#         # 这个方法必须返回一个字符串
#         return "l am a cat[%s]"%self.name
#  # tom是一个全局变量
# tom=Cat("TOM")
# print(tom)


'''
封装:
1.封装是面向对象编程的一个特点
面向对象的第一步就是将属性和方法封装到一个抽象的类中
外界使用类创建对象,然后使用对象调用方法
对象方法的细节都被封装在类的内部
'''

'''
class Person:
    # 初始化
    def __init__(self,name,weight):
        # self.属性=形参
        self.name=name
        self.weight=weight
    #     描述

    def __str__(self):
        return "my name %s weight %s"%(self.name,self.weight)

    def run(self):
        print("%s 爱跑步,锻炼身体"%self.name)

    def eat(self):
        print("%s 是一个吃或"%self.name)
        self.weight+=1
# 在对象的方法内部可以直接调用方法的属性
xiaoming=Person("XIAOMING",75.0)
xiaoming.run()
xiaoming.eat()

print(xiaoming)
'''# example


'''
class Person:
    # 初始化
    def __init__(self,name,weight):
        # self.属性=形参
        self.name=name
        self.weight=weight
    #     描述

    def __str__(self):
        return "my name %s weight %s"%(self.name,self.weight)

    def run(self):
        print("%s 爱跑步,锻炼身体"%self.name)

    def eat(self):
        print("%s 是一个吃或"%self.name)
        self.weight+=1
# 在对象的方法内部可以直接调用方法的属性
xiaoming=Person("XIAOMING",75.0)
xiaoming.run()
xiaoming.eat()
xiaomei=Person("xiaomei",45.5)
xiaomei.eat()
xiaomei.run()
print(xiaomei)
print(xiaoming)
# 同一个类创建多个对象,对象直接的属性是互不影响的
'''

# 开发中,被使用的类总是先开发

'''
class HouseItem:
    def __init__(self,name,area):
        self.name=name
        self.area=area

    def __str__(self):
        return "[%s] zhandi %.2f"%(self.name,self.area)


class House:
    def __init__(self,type,area):

        self.type=table
        self.area=area

        self.freearea=area
        self.item_list=[]

    def __str__(self):
         # python能够自动将一对括号的代码链接在一起
         return ("huxing: %s
 zongmianji:%.2f[shengyu :%.2f]
 jiaju:%s"
                 %(self.type,self.area,
                   self.freearea,self.item_list))

    def AddItem(self,item):
        print("要添加%s"%item)

#创建家具
bed=HouseItem("XIMENGSI",4)
chest=HouseItem("yigui",2)
table=HouseItem("canzhuo",1.4)
print(bed)
print(chest)
print(table)

# 创建房子对象

myhouse=House("两室一厅",60)
myhouse.AddItem(bed)
myhouse.AddItem(chest)
myhouse.AddItem(table)
print(myhouse)
'''

class HouseItem:
    def __init__(self,name,area):
        self.name=name
        self.area=area

    def __str__(self):
        return "[%s] zhandi %.2f"%(self.name,self.area)


class House:
    def __init__(self,type,area):

        self.type=table
        self.area=area

        self.freearea=area
        self.item_list=[]

    def __str__(self):
         # python能够自动将一对括号的代码链接在一起
         return ("huxing: %s
 zongmianji:%.2f[shengyu :%.2f]
 jiaju:%s"
                 %(self.type,self.area,
                   self.freearea,self.item_list))

    def AddItem(self,item):
        print("要添加%s"%item)
        #1.判断家具的面积
        if item.area>self.freearea:
            print("%s too big"%item.name)
            return

        #2.将家具的名称添加到列表中
        self.item_list.append(item.name)
        #计算剩余面积
        self.freearea-=item.area

#创建家具
bed=HouseItem("XIMENGSI",40)
chest=HouseItem("yigui",2)
table=HouseItem("canzhuo",1.4)
print(bed)
print(chest)
print(table)

# 创建房子对象

myhouse=House("两室一厅",60)
myhouse.AddItem(bed)
myhouse.AddItem(chest)
# myhouse.AddItem(table)
print(myhouse)
  
原文地址:https://www.cnblogs.com/gaowenxingxing/p/10006203.html