小甲鱼 发表于 2022-5-19 03:18:17

已有 25 人购买  本主题需向作者支付 5 鱼币 才能浏览 购买主题

KinokoCC 发表于 2022-5-19 10:00:52

亲眼见证更新。。慢慢学起来。

fishcyou 发表于 2022-5-27 20:39:29

绑定

为什么在之前例子中,需要加`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,和类没有关系

小古比鱼 发表于 2022-9-26 19:23:38

实例中类的方法是共享的,实例的属性却可以是自己的,独一无二,互不干扰,可通过__dict__进行内省来查看。“self”的作用就是将实例对象与类的方法进行绑定,从而通过类中的方法设置实例对象自己的属性,这也便解决了上一节课遗留下来的问题。虽然可以直接通过类来修改类属性,但这种做法很不提倡,因为所有从类生成的实例对象都共享该属性,修改后会牵一发而动全身,造成难以维护的bug,甚至可能比修改全局变量更危险!
视频最后还介绍了一个旁门左道的小技巧——定义一个最小的类,即除了pass语句之外什么都没有的空类。这样的类看似毫无价值,实则可以当作字典来使用,用修改类属性的方法即可实现,或通过空类生成的实例来模拟字典,方便快捷!由此可见,面向对象编程是一种高级的编程思想,虽非必须,但学好它就可以像造物者创造世界一样创造自己的程序,新奇好玩,充满乐趣!

yanfeigao 发表于 2023-1-8 23:22:58

属性独立,方法共享

飞不起来 发表于 2023-1-25 20:14:01

除了继承还有方法改变类的属性和方法么。
{:10_245:}

gengiskhan 发表于 2023-3-5 20:26:08

视频为什么挂了?{:5_96:}

leizhenzi23 发表于 2023-11-10 13:54:56

类似这样去掉所有的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]
查看完整版本: 第060讲:类和对象(III)