Python面向对象编程(二)

xiaoxiao2021-03-01  15

1.类变量

类变量是类的属性,此属性属于类,不属于此类的实例

1.1 作用: 通常用来存储该类创建对象的共有属性

1.2 说明:

类变量可以通过该类直接访问 类变量可以通过该类的实例对象直接访问 类变量可以通过此类的对象的__class__属性间接访问

1.3 示例

class Human(): total_count = 0 # 类变量,用来记录Human对象的个数 pass # 类变量可以通过该类直接访问 print(Human.total_count) # 访问类变量 # 类变量可以通过该类的实例对象直接访问 h1 = Human() print(h1.total_count) # 借助该类的实例访问类变量(属性) h1.total_count = 100 # 这一步为实例添加实例属性 print(h1.total_count) print(Human.total_count) # 实例对象不能改变类变量 # 类变量可以通过此类的对象的__class__属性间接访问 h1.__class__.total_count +=1 # 等同于 Human.total_count += 1 print(Human.total_count)

输出如下

0 0 100 0 1

示例 2

# 此类示意用类变量记录Human对象的个数 class Human: total_count = 0 # 类变量,用来记录Human对象的个数 def __init__(self,n): self.name = n self.__class__.total_count +=1 print(n,"对象被创建") def __del__(self): print(self.name,'对象被销毁') self.__class__.total_count-=1 L = [] L.append(Human('张飞')) L.append(Human('关羽')) print('当前人物个数是',Human.total_count) del L[1]

输出如下

张飞 对象被创建 关羽 对象被创建 当前人物个数是 2 关羽 对象被销毁 张飞 对象被销毁

2.类的文档字符串

类内第一个没有赋值给任何变量的字符串为类的文档字符串 类的文档字符串可以通过help()函数查看 类的文档字符串绑定在类的__doc__属性上

3.类的 slots 列表

3.1 作用:

限定一个类创建的实例只能有固有的属性(实例变量) 不允许对象添加列表以外的实例属性(实例变量) 防止因为用户写错属性名二发生程序错误

3.2 说明

__slots__属性绑定一个字符串列表 含有__slots__属性的类多创建的实例对象没有__dict__属性,即此实例不用字典来存储对象的实例属性

3.3 示例

class Human: __slots__ = ['name','age'] ## def __init__(self,n,a): self.name = n self.age = a def info(self): print(self.name,"今年",self.age,"岁") h1 = Human('小张',8) h1.info() h1.age = 9 # h1.Age = 10 #没有 __slots__属性的情况下,添加实例变量属性 # 此处会出错 因为__slots__ 属性 h1.info()

输出如下

小张 今年 8 岁 小张 今年 9 岁

4.类方法 @classmethod

类方法适用于描述类的行为的方法,类方法属于类,不属于类的实例对象

4.1 说明:

类方法需要使用@classmethod 装饰器定义 类方法至少有一个形参,第一个形参用于绑定类,约定写为'cls' 类和该类的实例都可以调用类方法 类方法不能访问此类创建的对象的实例属性

4.2 示例

class A: v = 0 # 类变量 # 类方法需要使用@classmethod 装饰器定义 # 类方法至少有一个形参,第一个形参用于绑定类,约定写为'cls' @classmethod def get_v(cls): return cls.v # 用cls.v访问类变量v @classmethod def set_v(cls,v): cls.v = v print('A.v=',A.get_v()) A.set_v(100) print('A.v=',A.get_v()) A.v = 200 # 不建议直接操作类变量,应该用方法 print('A.v=',A.get_v()) # 类和该类的实例都可以调用类方法 a = A() print(a.get_v()) a.set_v(200) print(a.get_v())

输出如下

A.v= 0 A.v= 100 A.v= 200 200 200

示例2

# 类方法不能访问此类创建的对象的实例属性 class A: v = 0 # 类变量 @classmethod def set_v(cls,v): '''请问此方法能否访问a.color属性?''' cls.v = v # print(cls.color) # 出错! type object 'A' has no attribute 'color' def get_myshuxing(self): # 实例方法,可以 print(self.color) a = A() a.color = '#FF0000' a.set_v(100) a.get_myshuxing()

输出

#FF0000

5.静态方法 @staticmethod

静态方法是定义在类内部的函数,此函数的作用域时类的内部

5.1 说明:

静态方法需要使用@staticmethod 装饰器定义 静态方法与普通函数定义相同,不需要传入self实例参数和cls类参数 # 功能上,就是普通函数 静态方法只能凭借该类或类创建的实例调用 静态方法不能访问类变量和实例变量

5.2 示例

# 此示例示意静态方法的定义和使用 class A: @staticmethod def myadd(a,b): return a+b print(A.myadd(100,200)) # 300 a = A() print(a.myadd(300,400)) # 700
转载请注明原文地址: https://www.6miu.com/read-4150313.html

最新回复(0)