8.类定义属性初始化和析构

Posted lyh-520

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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() 

炎志向前移动两步
炎志 被销毁了
墨染向前移动两步
墨染使用了一个技能
墨染 被销毁了

 

以上是关于8.类定义属性初始化和析构的主要内容,如果未能解决你的问题,请参考以下文章

php构造函数的PHP 5 构造函数和析构函数

Swift 构造与析构

继承的构造和析构

C++入门(拷贝)构造函数和析构函数

C++入门(拷贝)构造函数和析构函数

结构体的类属性特征