类对象和实例对象
类:Python中一切皆为对象,对象是抽象的,Python中的对象用类来表示。而在实示使用时,通常会找到类具体的存在。
在 Python 中,类 是一个特殊的对象 —— 类对象。
在程序运行时,类对象 在内存中 只有一份,使用 一个类可以创建出 很多个对象实例。
例如:
class AAA: #定义的类AAA属于 类对象
类对象拥有自己的属性 和 方法 即:类属性、类方法
实例对象: 某一个具体事物的存在,使用 类名() 创建。对象创建后,内存中就有了对象的一个实实在在的存在 ,即实例。
创建对象的动作分为两步:
1).在内存中为对象 分配空间
2).调用初始化方法 init 为 对象初始化
例如:
obj1 = AAA() #obj1属于 实例对象
针对实例,通常有以下说法:
1)通过类创建出来的 对象 叫做 类的实例
2)创建对象的动作 叫做 实例化
3)对象的属性 叫做 实例属性
4)对象调用的方法 叫做 实例方法
在程序执行时实例对象,实例对象拥有独立的内存空间,保存各自不同实例属性。调用实例对象方法,可以通过 self.访问自己的属性,self.调用自己的方法
类属性和类方法
类属性直接定义在类的内部,方法的外部。它被所有类对象的实例对象所共有。
类方法,定义时使用@classmethod装饰器。告诉解释器这是一个类方法。
类方法的 第一个参数 是 cls,是指由 哪一个类 调用的方法,方法内的 cls 就是 哪一个类的引用。调用类方法时,不需要传递 cls 参数。
类的内部调用类属性、类方法,格式为:
类名.类属性
类名.类方法
类的外部调用类属性、类方法,格式为:
类名.类属性
类名.类方法
实例名.类属性
实例名.类方法
class cumputer(object):
count = 0 #定义类属性
def __init__(self,name):
self.name = name
cumputer.count +=1
print(cumputer.count) #打印类属性的值 输出 0
c = cumputer('ThinkPad')
print(c.count) #实例对象调用类属性 输出 1
class person(object):
number = 0
def __init__(self,account):
self.account = account
person.number +=1
@classmethod
def show_person_number(cls):
print("人类对象的数量%d " %person.number)
p1 = person('Jenny')
p1.show_person_number() #输出:人类对象的数量1
p2 = person('amy')
p2.show_person_number() #输出:人类对象的数量2
实例属性和实例方法
实例方法的第一个参数必须是”self”,实例方法只能通过类实例对象进行调用,“self”就代表这个类实例本身。通过”self”可以直接访问实例的属性。
实例方法不需要添加装饰器。
实例属性,通常在初始化方法中 以 self.属性名 的格式创建。实例属性就相当于局部变量。出了这个类或者这个类的实例对象,就没有作用了。
class Person():
name = '小花'
def __init__(self):
self.age = 10
def print_age(self):
print(f"{Person.name}的年龄为:{self.age}")
person1 = Person()
print(person1.age)#输出:10
person1.print_age()#输出: 小花的年龄为:10
静态方法
在开发过程中,如果需要在 类 中封装一个方法,这个方法:
既 不需要 访问 实例属性 或者调用 实例方法
也 不需要 访问 类属性 或者调用 类方法
此时,可以把这个方法封装成一个 静态方法
静态方法 需要用 修饰器 @staticmethod 来标识,告诉解释器这是一个静态方法
通过: 类名. 调用 静态方法
class Person():
tel = '15000001111'
@staticmethod
def print_tel():
print(f"{Person.tel}")
person = Person()
person.print_tel() #15000001111
Person.print_tel() #15000001111
综合实例
class Game(object):
score = 0
def __init__(self,player):
self.player = player
@staticmethod
def help_info():
print("帮助信息: 注册后查看帮助可快速上手....")
@classmethod
def show_score(cls):
print(f"历史最高成绩是{Game.score}")
def start_game(self):
print(f"{self.player}正在开启游戏....")
#调用静态方法,查看帮助信息
Game.help_info()
#调用类方法,查看历史最高成绩
Game.show_score()
g = Game('aaa')
#调用实例方法,开启游戏
g.start_game()
小结:
类方法 —— 第一个参数是类对象cls,那么通过cls引用的必定是类对象的属性和方法;
实例方法 —— 第一个参数是实例对象self,那么通过self引用的可能是类属性、也有可能是实例属性,若存在相同名称的类属性和实例属性的情况下,实例属性优先级更高;
静态方法 —— 不需要额外定义参数,不需要访问 实例属性 和 类属性。因此在静态方法中引用类属性的话,必须通过类对象来引用。
网友评论