python 类对象,类属性,静态方法,类方法
1.实例对象属性和实例方法
class Cat(object): def __init__(self,name): # 定义一个实例 属性 self.name = name # 定义了一个实例方法 def info(self): print(self.name) def show(self): print('Show Run :') self.info()
# 测试
# 创建一个实例对象
tom = Cat('Tom') # 使用实例属性 print(tom.name) # 使用实例方法 tom.info() tom.show() # Python中万物皆对象 Cat.show(tom) # 一般不这样用,一般都是用实例对象调用实例属性和方法
输出:
Tom
Tom
Show Run :
Tom
Show Run :
Tom
# 结论: # 为什么类名不能调用 实例 对象属性和实例对象方法呢? # 因为类对象存在时,不一定有实例对象存在 # 实例属性和实例方法只能由实例对象调用
2.类对象和类属性
如果需要在类外修改类属性,必须通过类对象去引用然后进行修改。如果通过实例对象去引用,会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性。
class ClassRoom(object): # 当定义一个类属性时,相当于这个类中的全局变量 # 该类的所有对象都 可以使用该 类属性 # 可以在所有的对象间进行数据共享 center_kong_tiao = '格力空调' # 实例方法 def show(self): print('实例方法中去访问类属性:') print(ClassRoom.center_kong_tiao)
# 测试 cr901 = ClassRoom() print(cr901.center_kong_tiao) cr902 = ClassRoom() print(cr902.center_kong_tiao) cr901.center_kong_tiao = '海尔空调' print(cr901.center_kong_tiao) print(cr902.center_kong_tiao) ClassRoom.center_kong_tiao = '海尔空调' print(cr901.center_kong_tiao) print(cr902.center_kong_tiao)
# 输出: 格力空调 格力空调 海尔空调 格力空调 海尔空调 海尔空调
3.类方法
定义格式:
@classmethod def 方法名(cls,...): pass
调用格式:
类对象.类方法名
注意:
在类方法中,不能使用self
但是可以使用 cls,该参数用来表示 当前类对象,这个参数也是自动传递的
应用场景:
一般在设计类时,如果有类方法,该类一般不会去实例对象,直接使用类对象来操作(比如:数学函数类)
一般用来定义工具类使用
Math.max(1,2)
class MyMath(object): # 定义一个类属性 n = 999 # 标准格式 @classmethod # 这是一个装饰 器,用来表示下面的方法是一个类方法 def sum(cls,*args): print(cls.n) m = 0 for i in args: m += i return m # @classmethod 是一个装饰 器,用来修饰一个方法成为类方法,当在执行该 类方法时,解释 会自动 将类对象传递到参数 cls中 @classmethod def show(cls): print('show class method')
# 执行类方法 print(MyMath.sum(1,2,3,4,5)) mm = MyMath() print(mm.sum(1, 2, 3, 4, 5)) MyMath.show()
输出: 999 15 999 15 show class method
4.静态方法
格式:
@staticmethod def 方法名(参数列表....): pass
同类方法
类对象.静态方法名()
设计目的:
静态方法实际上就是放到类当中的一堆普通函数
作用:
静态方法同类方法相似,也是在不需要实例对象产生的条件下,可以使用静态方法来实现
一般这两种方法,都是用在工具类的实现上.
通过类,将一系列的功能方法进行整合到一起.
# 设计 一个编码工具类
class EncodeUtil(object): n = 1 # 编码方法 @staticmethod def encode_data(data, format): print(f'对数据 {data} 使用 {format} 格式 进行了编码') # 解码方法 @staticmethod def decode_data(data, format): print(EncodeUtil.n) print(f'对数据 {data} 使用 {format} 格式 进行了解编码') # 测试 eu = EncodeUtil() eu.encode_data('hello','utf-8') EncodeUtil.encode_data('Hello','utf-8') EncodeUtil.decode_data("hello",'GBK')
输出: 对数据 hello 使用 utf-8 格式 进行了编码 对数据 Hello 使用 utf-8 格式 进行了编码 1 对数据 hello 使用 GBK 格式 进行了解编码
5.总结
# 实例方法,必须通过实例对象调用执行,(第一个参数是当前调用该方法的实例)。
# 类方法, 当不需要产生实例对象时,可以使用类方法来实现相应的代码功能,类方法可以直接使用类对象来调用,类方法的第一个参数是 cls,用来接收当前类对象,通过这个参数,
可以各个类方法中进行共享数据。
# 静态方法, 作用同类方法相似,但是静态方法不接收任何默认参数(实例对象或类对象),静态方法其实就是将一些相关联的普通方法使用类进行整合。
# 类方法和静态方法,一般在使用时,大多数用来实现工具类。
浙公网安备 33010602011771号