类成员相关

知识点

实例化

1
2
# 程序在实例化的时候,都会创建一个自己独立的内存空间,用于保存各自不同的属性
# 同一个类下实例化的不同对象,他们的方法在内存中却只有一份,只有需要时才将对象的引用传递到方法的内部

类对象、属性

1
2
# python程序在运行时也会直接将类加载到内存中,只是类对象在内存中只有一份,使用一个类可以创建多个实例对象
# 类对象同时有自己的属性(类属性)、方法(类方法),可以通过"类名.属性/方法"进行访问

使用

1
2
3
4
5
6
7
8
9
10
11
12
13
# 类属性是给类对象中定义的属性,常用来记录这个类相关的特征,类属性不会用来记录具体对象的特征
# 定义方式:属性名 = 属性值 (在类下方直接定义)
# 使用方式:类名.类属性名
class Tool(object):

# 使用赋值语句定义类属性,记录被调用的次数
count = 0

def __init__(self):
Tool.count += 1 # 每次使用类实例化一个对象都会自动+1,并且该变量值存放在内存中的类对象中

tool1 = Tool()
print(Tool.count) # 通过"类名.属性/方法"进行访问

属性的寻找机制

1
2
# python中,如果通过"对象名.属性"来获取一个类中的属性,则会现在对象内部查找对象属性,寻找不到则会向类中查找类属性
# 如果使用"对象.类属性 = 值"赋值语句,只会给对象添加一个属性,而不会影响到类属性的值。如果需要访问类属性,则需要使用“类名.类属性”的方式进行访问

类方法

1
2
3
4
5
6
7
8
9
10
11
# 类方法必须要@classmethod来标识,同时传递的参数为cls。在类中cls表示的是类自身,可以访问自身属性和其它类方法
class Tool:

count = 0

@classmethod # 类方法必须要@classmethod标识
def show_tool_count(cls): # cls标识类本身,访问类属性和类方法时的格式为"cls.属性名/方法名"
print("被实例化的次数为 %d" %cls.count)

def __init__(self):
Tool.count += 1

静态方法

1
2
3
# 当只需要访问实例属性时,或者既要访问类属性,又要访问实例属性时,就定义实例方法
# 当只需要访问类属性,就定义类方法
# 当既不需要访问实例属性、方法,也不需要访问类属性、方法时,就定义静态方法
1
2
3
4
5
6
7
8
# 静态方法必须要用@staticmethod来标识,且不需要传递参数,调用的时候通过"类名.方法名"直接访问,且不需要将类实例化
class Tool:

@staticmethod # 静态方法必须要@staticmethod标识
def say_hello(): # 静态方法不需要传递参数
print("good boy")

print(Tool.say_hello()) # 调用静态方法不需要实例化,访问方式:类名.方法名

作业

  1. (问答)多个对象实例化时,其实例属性、实例方法在内存中的存储方式是什么样的
  2. (问答)pyhon程序运行的时候,类对象在内存中的状态是什么样的
  3. (问答)类属性的定义和调用方式是什么?调用类属性和类方法时,是否需要实例化?
  4. (问答)假如通过”对象名.属性”来查找属性值,则其在内存中的寻找途径是什么
  5. (问答)类方法的定义方式是什么
  6. (问答)在类方法中定义和调用类属性、其它类方法的方式是什么
  7. (问答)何时我们会选择使用静态方法
  8. (问答)静态方法的定义和使用方式是什么
  9. (问答)静态方法定义时是否需要实例化