类的结构
实例的概念
在面向对象开发的时候,第一步是设计类,然后用类名()创建对象,创建对象的动作有两步:
1.在内存中为对象分配空间
2.调用初始化方法__init__
为对象初始化。
对象创建之后,内存中就有了一个对象的实实在在的存在—实例。
创建出来的对象叫做类的实例
创建对象的动作叫做实例化
对象的属性叫做实例属性
对象调用的方法叫做实例方法
每个对象都拥有自己独立的内存空间,保存各自不同的属性。多个对象的方法,在内存中只有一份,在调用方法时,需要把对象的引用传递到方法的内部。对象可以通过self.
访问自己的属性或者调用自己的方法。
类是一个特殊的对象
定义的类属于类对象
通过类创建的对象属于实例对象
在python中,类是一个特殊的对象----类对象,在程序运行时同样会被加载到内存,并在内存中只有一份,使用一个类可以创建出很多对象实例。
除了 封装实例的属性和方法 外,类对象还可以拥有自己的属性和方法。
1、类属性
2、类方法
通过类名.
的方式,可以访问类的属性或者调用类的方法。
类属性就是在类对象中定义的属性,通常用来记录与这个类相关的特征,不会用于记录具体对象的特征。
在class下方,使用赋值语句,直接定义类属性。
# 使用赋值语句,定义类属性,记录用于创建工具对象的总数。
class Tool(object):
count = 0
def __init__(self, name):
self.name = name
Tool.count += 1
tool1 = Tool("斧头")
tool2 = Tool("锤子")
print("Tool.count")
在访问类属性的时候,使用的是类名.
的方式,而不是self.
属性获取存在一个向上查找的机制,使用对象.类属性
的方法,也能访问到类属性。但是不推荐这种方法。使用这种语句后,python会首先查找对象是否有这个属性,如果没有会向上访问类属性。
使用对象名.类属性 = 值
的赋值语句只会给对象创建一个属性,而不会影响类属性的值。
类方法
类方法就是针对类对象定义的方法,在类方法内部可以直接访问类属性,或者调用其他类方法。
类方法的定义语法如下:
@classmethod
def 类方法名(cls):
pass
类方法的定义时需要加一个修饰器,@classmethod
类方法的第一个参数应该是cls
通过类名.
调用类方法,调用时同样不需要传递cls
参数
同实例方法一样,在方法内部:
可以通过cls.
访问类属性
也可以通过cls.
调用其他类方法
@classmethod
def tools_count(cls):
print("总共有%d个工具" % cls.count)
Tool.tools_count()
静态方法
如果在开发过程中,需要封装一个方法,即不需要访问实例属性或者调动实例方法,也不需要访问类属性或者类方法,这个时候可以把这个方法封装成一个静态方法。
语法如下:
@staticmethon
def 静态方法名():
pass
同样,可以通过类名.
调用静态方法。
@staticmethod
def run():
print("小狗正在疯狂的跑")
这样可以通过类名.
的方法直接调用,而不需要创建实例对象。
综合应用:
# *-*coding:utf-8*-*
class Game(object):
top_score = 0
def __init__(self, name):
self.name = name
@staticmethod
def show_help():
print("这个游戏贼难玩")
@classmethod
def show_top_score(cls):
print("最高分是%d" % cls.top_score)
def start_game(self):
print("%s开始游戏" % self.name)
xiaoming = Game("小明")
Game.show_help()
Game.show_top_score()
xiaoming.start_game()
运行结果:
这个游戏贼难玩
最高分是0
小明开始游戏
1、实例方法—方法内部需要访问实例属性
(实例方法内部可以使用类名.
访问类属性)
2、类方法—方法内部只需要访问类属性
3、静态方法—方法内部,不需要访问实例属性和类属性