类定义
类 是一个独立存放变量(属性/方法)的空间
封装:
类可以把各种对象组织在一起,作为类的属性,通过 . (点)运算符来调用类中封装好的对象
属性:
变量在类中称为属性,但是类中的属性不仅仅只包含变量,函数等其他的对象也可以作为类的属性
类的定义:关键字class
是一类事物的抽象,不是真是存在的。 描绘了该类事物的共性, 例如:“人类”、“猫类”、“狗类
创建实例:
某类事物的具体个体,是该类事物的具体表现,它是真实存在的。 例如:“炎志”是具体的某个“人” ''墨染''是某个具体的’人’ “加菲猫”是具体的某个“猫” ''汤姆猫'' 是某个具体的’猫‘
实例名 = 类名()
一个“实例”的“特征”,就是“属性”
名字不一样, 身高不一样, 年龄不一样, 大小也不一样
类属性和实例属性
类属性:在类里面定义的属性,可以通过类和实例访问
实例属性:通过实例定义的属性,只能通 过实例访问
类的私有属性
在python中有两私有属性,分别是在属性前加 一个下换线(_) 和 两个 下划线(__)
_x: 意义在于唤起用户的注意,看成私有属性,类对象和子类可以访问
__xx:双前置下划线,避免与子类中的属性命名冲突,无法在外部直接访问
(名字重整所以访问不到)
私有属性: 在 Python 中, _ 和 __ 的使用 更多的是一种规范/约定, 没有真正限制的目的
方法
类中的方法,就是函数
通常,将默认会传入的那个参数命名为self,用来表示调用这个方法的实例对象本身。
方法总是定义在类中的,但是却叫“实例方法”,因为它表示该类所有实例所共有的行为
方法的调用和属性调用一样,通过点操作符调用,传参和函数传参一样
class Hero(object):def move(self): #self代表实例本身,那个实例调用就代表那个实例print("%s走向战场"%self.name) #yanzhi.name #moran.namedef 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 = nameself.HP = HPdef move(self): #self代表实例本身,那个实例调用就代表那个实例print("%s走向战场"%self.name) #yanzhi.name #moran.namedef 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 = nameself.HP = HPdef __del__(self):print(self.name,'被销毁了')def move(self): #self代表实例本身,那个实例调用就代表那个实例print("%s走向战场"%self.name) #yanzhi.name #moran.namedef 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 = nameself.HP = HPdef __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() 炎志向前移动两步 炎志 被销毁了 墨染向前移动两步 墨染使用了一个技能 墨染 被销毁了