Discuss / Python / <提问>封装的另一个好处是可以给Student类增加新的方法

<提问>封装的另一个好处是可以给Student类增加新的方法

Topic source

关于封装的这句话,我不是很理解。

《封装的另一个好处是可以给Student类增加新的方法》

为什么这么说呢? 难道不封装就不能给类增加方法了吗? 也就是想知道,封装和定义新的类方法有什么关系?

我的理解是,封装是对属性的封装,也就是在类里定义一个访问数据的函数

    # 类的内部定义访问数据的函数,这样把“数据”给封装起来,称之为类的方法
    def print_score(self):
        print('%s:%s' %(self.name,self.score))

那如果我们不定义上面这个封装数据的类方法,难道就不能增加下面的get_grade方法了吗?

    def get_grade(self):
        if self.score >= 90:
            return 'A'
        elif self.score >= 60:
            return 'B'
        else:
            return 'C'

根据我的测试结果来看,感觉没什么必然联系啊。 哪位大佬能给帮忙解释下,廖大这句话想说明什么?

蒙面人mm

#2 Created at ... [Delete] [Delete and Lock User]

同有这个疑问

醉心捕梦

#3 Created at ... [Delete] [Delete and Lock User]

同疑问?

我的理解是所谓的封装就是定义一个关联实例的内部函数,就是类的方法,外部只需调用方法就可以获取数据,get_grade本身也是一种封装。如果不封装那调用数据就需要在类的外面重新定义函数get_grade,如果需要对某些实例的数据大量操作调用是不是就要定义很多的调用函数,这样看起来代码会非常乱,而把调用函数封装到类里面作为类的方法那么代码看起来会简洁一点,个人观点,不知道对不对欢迎讨论。

如果从get_grade也是一种封装来考虑,那应该可以理解廖大这句话了。 也就是说,get_grade也是把实例本身拥有的数据封装起来,便于实例对象直接调用这些类方法。

但是,对于如果不封装成类的方法,需要对实例的大量数据操作调用就需要定义很多个调用函数这个理解,我个人认为应该不是这样的吧。

就拿本节的student这个例子来说, 如果是定义在类之外的调用函数,那他应该是这样的: get_grade(bart) 如果是封装在类中的类方法,那他应该是这样的: bart.get_grade()

区别在于,类方法是把封装数据的函数和类本身关联起来的。 而没有封装的函数,因为没有关联起来,所以需要参数指定是哪一个实例对象。

所以,我觉得即使是调用函数,也不存在需要定义很多的函数的问题吧?

我觉得封装的好处只是便于调用,不需要知道实现细节。 还有其他什么好处吗?或者说一定要封装的情况吗?

lovekernel0

#6 Created at ... [Delete] [Delete and Lock User]

其实没有想的那么复杂,封装的一个好处是可以在类内部通过方法来访问属性,对外部隐藏了一些内部细节;另一个好处是可以“动态”给类增加新的方法。它们说的其实是同一件事:

在类的内部定义访问数据的函数,把数据(或说属性)给封装起来。这些封装数据的函数是和类本身是关联起来的,即类的方法

安迪博德

#7 Created at ... [Delete] [Delete and Lock User]

用户6223899516_84125

如果是定义在类之外的调用函数,那他应该是这样的: get_grade(bart) 如果是封装在类中的类方法,那他应该是这样的: bart.get_grade()

定义在类里面的好处:单一职责 + 高内聚

楼主基本理解没问题 封装一般是对属性的封装 属性就是这个类基本要保存的数据 然后楼主的问题 print_score函数和get_grade函数没联系,这两个函数独立的,缺哪个都不影响另一个的执行 为了区别,从现在开始把所有在类内部定义的,实现类属性封装数据的函数统一叫这个类的方法. 教程里面的方法定义可能是偷懒的做法,也就是每个方法都直接通过self.属性名获取值

可能廖总真正要表达的是: 首先定义类里面设置get方法,案例就是两个方法 分别为getName和getScore分别返回这两个属性实际值 然后print_score方法和get_grade方法内部获取数据都是调用类自己的getName方法和getScore方法实现 这样做的好处是,可能会定义很多的针对使用处理类name和score属性数据的方法. 所有方法内部都是通过getName和getScore这两个方法获取数据的,则有一天需要修改类的name属性名称为myName的时候,只要修改一个getName的方法就可以了,其他方法全都不受影响 而如果所有的方法都内部是直接通过self.name获取的数据,则现在属性名改成myName了..... 廖总可能说的数据封装可以给类增加新的方法要表达是这个意思

从对象使用上 外面函数获取对象数据,通过调用对象的方法,本身就是封装,获取和处理对象数据的方法本身应该在类定义时候定义好,同样的道理,类内容修改了,只修改类内的相关方法实现就可以了,所有外面调用类对象都不会受到影响(当然是相对的,你得保持方法名不变吧,方法名变了,外面函数调用怎么可能不改)


  • 1

Reply