zoukankan      html  css  js  c++  java
  • 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)
      
  • 相关阅读:
    myeclipse部署maven项目到tomcat,src/main/resources里面配置文件部署不到webapp下classes
    MyEclipse自动生成Ant Build.xm
    MySQL This function has none of DETERMINISTIC, NO SQL...错误1418 的原因分析及解决方法
    解决openoffice进程异常退出的办法:
    【常见Web应用安全问题】---4、Directory traversal
    Errors running builder 'DeploymentBuilder' on project ' 解决方法
    linux CentOS 安装rz和sz命令 lrzsz
    (转)Maven的pom.xml文件结构之Build配置build
    spring整合xfire出现Document root element "beans", must match DOCTYPE root "null"错误解决方案
    linux解压zip、bz、bz2、z、gz、tar(解包)
  • 原文地址:https://www.cnblogs.com/gaowenxingxing/p/10006203.html
Copyright © 2011-2022 走看看