为什么在之前例子中,需要加`self`呢?
这样做的目的是:实现实例对象和类的方法进行绑定。
看起来像是把自己的名字贴在一辆共享单车上面(好傻)有什么意义呢?
其实是因为:在实例中,类的方法确实是共享的,但是实例的属性却可以是自己的。
例:
class C:
def set_x(self, v):
self.x = v
c = C()
c.set_x(250)
c.x
>>>
250
# 现在c拥有了自己的属性,但是C的x还是没值的。
# 我们可以尝试给C的x属性一个值:
C.x = 100
C.x
>>>
100
c.x
>>>
250
# c的值还是250,和类没有关系 实例中类的方法是共享的,实例的属性却可以是自己的,独一无二,互不干扰,可通过__dict__进行内省来查看。“self”的作用就是将实例对象与类的方法进行绑定,从而通过类中的方法设置实例对象自己的属性,这也便解决了上一节课遗留下来的问题。虽然可以直接通过类来修改类属性,但这种做法很不提倡,因为所有从类生成的实例对象都共享该属性,修改后会牵一发而动全身,造成难以维护的bug,甚至可能比修改全局变量更危险!
视频最后还介绍了一个旁门左道的小技巧——定义一个最小的类,即除了pass语句之外什么都没有的空类。这样的类看似毫无价值,实则可以当作字典来使用,用修改类属性的方法即可实现,或通过空类生成的实例来模拟字典,方便快捷!由此可见,面向对象编程是一种高级的编程思想,虽非必须,但学好它就可以像造物者创造世界一样创造自己的程序,新奇好玩,充满乐趣! 属性独立,方法共享 除了继承还有方法改变类的属性和方法么。
{:10_245:} 视频为什么挂了?{:5_96:} 类似这样去掉所有的self,为啥还会报错: takes 0 positional arguments but 1 was given
class Turtle():
def say():
print("小王八")
class Cat():
def say():
print("小猫")
class Dog():
def say():
print("大狗")
class Garden():
t = Turtle()
c = Cat()
d = Dog()
def say():
t.say()
c.say()
d.say()
g = Garden()
g.say()
Traceback (most recent call last):
File "<pyshell#22>", line 1, in <module>
g.say()
TypeError: Garden.say() takes 0 positional arguments but 1 was given
页:
[1]