# 通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法
"""类对象
需要知道的是self代指实例,cls代指类,这是python中定义好的规范
变量(字段):
1、实例变量(普通字段):实例变量属于实例(对象),只在实例(对象)方法被调用
2、类变量(静态字段):类变量属于类,在内存中只保存一份,当一个类中的多个方法使用相同的变量(字段)使类变量,类变量可以被类和实例(对象)调用
方法:
1、普通方法:保存在类中,通常由实例(对象)调用,但是可以通过类和实例(对象)访问
2、静态方法:保存在类中,由类直接调用,self不在是必须的,通过@staticmethod 声明,但是可以传递参数,类似于直接写了一个函数
3、类方法:保存在类中,由类直接调用
"""
"""变量
1、实例变量:如果对象中保存一些值,执行某个功能时需要使用对象中的值,使用实例变量
2、类变量:不需要任何对象中的值,但是一个或多个方法需要使用的值,使用类变量
"""
class Province:
country = '中国' # 类变量
def __init__(self, name):
self.name = name # 对象变量
hebei = Province("河北")
henan = Province("河南")
# 示例1、实例变量只能被实例调用,不能被类调用
print(hebei.name)
print(henan.name)
# 会报错,因为实例变量不能被类调用
# print(Province.name)
# 示例2、类变量可以被类和实例调用
print(hebei.country)
print(henan.country)
# 不会报错,类变量可以直接被类调用
print(Province.country)
"""类的方法
1、普通方法:如果对象中保存一些值,执行某个功能时需要使用对象中的值,使用实例变量
2、静态方法:不需要任何对象中的值,使用静态方法
3、类方法:如果在使用时用到当前类的话,使用类方法
"""
# 示例1、普通方法可以通过类和实例调用
class Foo1:
def __init__(self):
print('init')
def bar(self): # 必须传参self
print('method')
# 通过实例调用,创建类的实例foo,创建时会执行构造方法,打印init,然后调用bar方法打印methodo
foo1 = Foo1()
foo1.bar() # 会自动将实例(foo)传递给self
# 通过类调用,并未执行构造方法,说明没有创建实例,直接调用bar打印hello
# 通过类调用需要传参,因为定义方法时设置了形参self,没有创建实例需要自己传入
Foo1.bar('test')
# 示例2、静态方法,直接被类调用不用self
class Foo2:
@staticmethod # 装饰器,声明这个方法是静态方法
def bar(): # 可以不传递self参数
print('staticmethod')
@staticmethod
def bar2(a1, a2): # 静态方法可以传参
print(a1, a2)
# 通过类调用,不需要传参
Foo2.bar()
# 通过类调用,传递参数
Foo2.bar2(1, 2)
# 示例3、类方法
class Foo3:
@classmethod
def bar(cls): # 类方法使用cls而非self,必填.cls代指类,所以不需要实例
print('classmethod')
Foo3.bar() # 会自动将类传递给形参cls