在写python的类时,总是分不清什么时候方法之间可以共用某些属性,什么情况下不能。写该博客记录一下,欢迎大家补充改正。
类的方法之间可以共用类的属性和类的实例属性。
类的实例属性:
实例属性是附加到类的实例上的属性。
实例属性写在构造函数中:
class MyClass:
def __init__(self, value):
self.instance_attr = value
self就表示MyClass这个类本身,self.instance_atter就表示instance_atter是MyClass这个类的实例的属性。
class MyClass:
def __init__(self, value):
self.instance_attr = value
def add(self):
print(f'和是{self.instance_attr+self.instance_attr}')
def product(self):
print(f"乘积是{self.instance_attr*self.instance_attr}")
myclass=MyClass(5)
myclass.add() #10
myclass.product() #25
在创建类的实例myclass时,要将构造函数中需要的参数传入,add方法和product方法都可以调用类的实例的属性正常运行。
实例写在某一个方法中:
class A:
def b(self):
self.d = D() # 在方法b中实例化一个D类对象
print("Method b called")
def c(self):
# 在方法c中可以访问并使用d,因为它是实例属性
print("Method c called")
self.d.do_something() # 调用D类对象的方法
class D:
def do_something(self):
print("Method do_something in class D called")
# 创建A类的实例
a = A()
a.b() # 调用方法b,实例化D类对象
a.c() # 调用方法c,可以访问和使用之前实例化的D类对象
该代码中,在类A的方法b中,实例化了一个类对象D,并且使用self.d=D(),将d作为一个实例赋给了self(也就是类A),所以现在d是A的类的实例属性,那么在c方法中就可以调用该类的实例的属性,但是这是在类A调用了b方法的前提下才能将D实例化,否则该类的实例的属性不存在,c方法也就无法调用了。
类的实例的属性是通过实例化类对象之后传参进行赋值的,所以类的实例的属性的值取决于每个实例,通常是不一样的。
类的属性:
class MyClass:
class_attr = "I am a class attribute"
# 访问类属性
print(MyClass.class_attr) # 输出 "I am a class attribute"
# 尝试通过实例修改类属性的值(这不会成功)
obj = MyClass()
obj.class_attr = "This won't change the class attribute"
print(obj.class_attr) # 输出 "This won't change the class attribute"
print(MyClass.class_attr) # 输出 "I am a class attribute",类属性的值不变
- 类的属性属于类本身,可以通过类名直接访问,而类的实例的属性只能通过类的实例进行访问。
- 通过实例化类可以改变类属性的在该实例中的值,但是并不能改变类属性本身的值。