面向对象编程:属性添加、类成员修改/添加及实例化疑问
嘿,我来帮你把这些面向对象编程的困惑掰扯清楚~
给对象属性添加/修改内容的方法
你有两种常用方式来操作对象的属性:
- 直接操作实例:当你创建好一个类的实例后,直接用
实例名.属性名就能修改已有属性,或者新增全新的属性。比如:foo_instance = Foo(10) foo_instance.a = 20 # 修改__init__里初始化的a属性 foo_instance.b = "这是新增的属性" # 给这个实例加个新属性b - 通过类的方法操作:就像你代码里的
hello方法,在类的方法里用self.属性名来操作——因为self代表的就是当前调用这个方法的实例本身。把你的hello方法补全就更清楚了:
当你调用def hello(self): self.a = 100 # 修改当前实例的a属性foo_instance.hello()时,self就指向foo_instance,自然能修改它的a属性。
修改或添加类的成员
类本身也可以添加或修改成员(包括类属性、类方法):
- 类属性的操作:类属性是属于整个类的,所有实例共享。你可以直接在类外部赋值,或者在类内部用类方法修改:
# 类外部添加类属性 Foo.shared_attr = "所有Foo实例都能访问我" # 类内部定义并修改类属性 class Foo: count = 0 @classmethod def add_count(cls): cls.count += 1 # cls代表类本身 - 类方法的操作:同样可以在类外部给类绑定新方法,或者在类定义里直接添加:
# 类外部添加普通方法 def greet(self): print(f"我的a属性是{self.a}") Foo.greet = greet # 类内部直接定义方法就可以啦,比如你写的__init__和hello
为什么hello方法能修改__init__里的a属性?
这其实是面向对象的核心逻辑之一:__init__方法里的self.a = a,是给每个实例创建了一个独有的实例属性a。而hello方法里的self,就是当前调用这个方法的那个实例的“引用”——简单说,self就是实例本身在方法里的代号。
所以当你调用foo_instance.hello()时,self就等同于foo_instance,修改self.a就是直接修改这个实例的a属性。这说明实例的属性是可以被类的方法访问和修改的,因为方法通过self拿到了实例的“入口”。
实例化和其他核心概念的关系
用接地气的话解释:
- 类:就是一个“模板”,比如
Foo这个类,规定了它的对象(实例)应该有哪些属性(比如a)和方法(比如hello)。 - 实例化:就是用这个模板“造东西”,
foo_instance = Foo(10)就是造了一个具体的Foo对象,每个实例都是独立的——比如你再造一个foo2 = Foo(20),它的a是20,和foo_instance的a互不干扰。 - self的意义:类里的方法必须带
self作为第一个参数,它是实例的“代言人”。每个实例调用方法时,Python会自动把这个实例传给self,这样方法里操作self就只会影响当前实例,不会搞混其他实例。
内容的提问来源于stack exchange,提问作者Sirswagger21
相关产品推荐
相关产品推荐

