zoukankan      html  css  js  c++  java
  • 8.类定义、属性、初始化和析构

            类定义       

    类 是一个独立存放变量(属性/方法)的空间

    封装:

    类可以把各种对象组织在一起,作为类的属性,通过 . (点)运算符来调用类中封装好的对象

    属性:

    变量在类中称为属性,但是类中的属性不仅仅只包含变量,函数等其他的对象也可以作为类的属性

    类的定义:关键字class

    是一类事物的抽象,不是真是存在的。 描绘了该类事物的共性, 例如:“人类”、“猫类”、“狗类

    创建实例:

    某类事物的具体个体,是该类事物的具体表现,它是真实存在的。 例如:“炎志”是具体的某个“人” ''墨染''是某个具体的’人’ “加菲猫”是具体的某个“猫” ''汤姆猫'' 是某个具体的’猫‘

    实例名 = 类名()

     

    一个“实例”的“特征”,就是“属性”

    名字不一样, 身高不一样, 年龄不一样, 大小也不一样

    类属性和实例属性

    类属性:在类里面定义的属性,可以通过类和实例访问

    实例属性:通过实例定义的属性,只能通 过实例访问

    类的私有属性

    在python中有两私有属性,分别是在属性前加 一个下换线(_) 和 两个 下划线(__)

    _x: 意义在于唤起用户的注意,看成私有属性,类对象和子类可以访问

    __xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问

    (名字重整所以访问不到)

     

    私有属性: 在 Python 中, _ 和 __ 的使用 更多的是一种规范/约定, 没有真正限制的目的

          方法       

    类中的方法,就是函数

    通常,将默认会传入的那个参数命名为self,用来表示调用这个方法的实例对象本身。

    方法总是定义在类中的,但是却叫“实例方法”,因为它表示该类所有实例所共有的行为

    方法的调用和属性调用一样,通过点操作符调用,传参和函数传参一样

    class Hero(object):
    
        def move(self):                     #self代表实例本身,那个实例调用就代表那个实例
            print("%s走向战场"%self.name)    #yanzhi.name  #moran.name
    
        def skill(self):
            print("%s使用了技能:砍一刀"%self.name)           #在类中定义的方法叫实例方法不叫类方法
    
    yanzhi = Hero()
    moran = Hero()
    yanzhi.name = '炎志'
    moran.name = '墨染'
    print(yanzhi.name)
    yanzhi.move()
    yanzhi.skill()
    print("=========================================")
    print(moran.name)
    moran.move()
    moran.skill()
    
    炎志
    炎志走向战场
    炎志使用了技能:砍一刀
    =========================================
    墨染
    墨染走向战场
    墨染使用了技能:砍一刀

      初始化和析构 

    一、初始化”特殊方法

    在Python中有很多以双下划线开头且以双下划线结尾的固定方法。

    他们会在特定的时机被触发执行。

    __init__ 就是其中之一,它会在实例化之后自动被调用。以完成实例的初始化。

    class Hero(object):
        def __init__(self,name,HP):
            self.name = name
            self.HP = HP
        def move(self):                     #self代表实例本身,那个实例调用就代表那个实例
            print("%s走向战场"%self.name)    #yanzhi.name  #moran.name
    
        def skill(self):
            print("%s使用了技能:砍一刀"%self.name)           #在类中定义的方法叫实例方法不叫类方法
    yanzhi = Hero('炎志',3000)
    moran = Hero('墨染',2500)
    print(yanzhi.name)
    print(yanzhi.HP)
    yanzhi.move()
    yanzhi.skill()
    print("=========================================")
    print(moran.name)
    print(moran.HP)
    moran.move()
    moran.skill()
    
    
    炎志
    3000
    炎志走向战场
    炎志使用了技能:砍一刀
    =========================================
    墨染
    2500
    墨染走向战场
    墨染使用了技能:砍一刀

    二、__init__ 的参数传递过程

     

    三、基于变量计数的对象销毁机制

    当没有一个变量指向某个对象的时候,Python会自动销毁这个对象,以便回收内存空间。

    del 关键字,可以删除一个变量的指向。

     __del__”就是一个析构函数了,当使用del 删除对象时,会调用他本身的析构函数。 提示开发者,对象被销毁了,方便调试。 进行以写必要的清理工作。

    #代码运行完自动销毁
    class Hero(object):
        def __init__(self,name,HP):
            self.name = name
            self.HP = HP
        def __del__(self):
            print(self.name,'被销毁了')
        def move(self):                     #self代表实例本身,那个实例调用就代表那个实例
            print("%s走向战场"%self.name)    #yanzhi.name  #moran.name
    
        def skill(self):
            print("%s使用了技能:砍一刀"%self.name)           #在类中定义的方法叫实例方法不叫类方法
    yanzhi = Hero('炎志',3000)
    moran = Hero('墨染',2500)
    print(yanzhi.name)
    print(yanzhi.HP)
    yanzhi.move()
    yanzhi.skill()
    print("=========================================")
    print(moran.name)
    print(moran.HP)
    moran.move()
    moran.skill()
    
    炎志
    3000
    炎志走向战场
    炎志使用了技能:砍一刀
    =========================================
    墨染
    2500
    墨染走向战场
    墨染使用了技能:砍一刀
    墨染 被销毁了
    炎志 被销毁了
    class Hero():
        def __init__(self,name,HP):
            self.name = name
            self.HP = HP
        def __del__(self):
            print(self.name,'被销毁了')
        def move(self):
            print('%s向前移动两步'%self.name)
        def skill(self):
            print('%s使用了一个技能'%self.name)
    
    yanzhi = Hero('炎志',3000)
    moran = Hero('墨染',3000)
    yanzhi.move()
    del yanzhi           #主动销毁
    moran.move()
    moran.skill() 
    
    炎志向前移动两步
    炎志 被销毁了
    墨染向前移动两步
    墨染使用了一个技能
    墨染 被销毁了
  • 相关阅读:
    android游戏开发框架libgdx的使用(十二)—TiledMap地图的使用
    android游戏开发框架libgdx的使用(十一)—Skin和UI配置文件的使用
    子句判断、启动强度和去模糊化AForge.NET框架的使用(三)
    分享从网上收集的一些游戏资源,以RPG类为主
    android游戏开发框架libgdx的使用(十六)—使用TexturePacker工具加快开发速度
    android游戏开发框架libgdx的使用(十三)—TiledMap中的角色和角色移动
    Ajax实现评论的顶和踩功能
    Jelastic支持java的PaaS
    真心好用的VS扩展NuGet
    分享几篇文章(PDF版)
  • 原文地址:https://www.cnblogs.com/lyh-520/p/9293779.html
Copyright © 2011-2022 走看看