openKylin论坛

标题: 关于python对象属性修改 [打印本页]

作者: 小叶冰城    时间: 2016-3-22 20:47
标题: 关于python对象属性修改
本帖最后由 小叶冰城 于 2016-3-23 08:51 编辑

help!!!大大大神们,我有个问题
问题描述:
定义一个class A
class A():
    x = y
    def change(self,value):
        self.x = value


对于A类的一个实例a
a = A()
现在要改变a中属性x的值
a.x = value
a.change(value)
上面两种方法哪个更好?为什么?
非常感谢


作者: 小叶冰城    时间: 2016-3-22 21:05
本帖最后由 小叶冰城 于 2016-3-22 21:06 编辑

个人觉得,函数调用,会涉及到函数参数在栈中内存的分配,是不是会耗费一些时间,所以a.x=value 速度更快,但是貌似违背了面向对象的封装特性?so 该怎么选择?

作者: yangzuxun010    时间: 2016-3-23 17:33
选择 第二种
作者: Lurking    时间: 2016-3-23 22:56
本帖最后由 Lurking 于 2016-3-24 13:23 编辑

第二种。没有违背。因为你用到了类,类是一种封装。
A类封装了成员x,并对x进行了初始化,也就是x的value是y。
还定义了一个对该成员的一个操作的函数,这算是一个最简单的委托模式,
该函数也是对外提供的一个用于处理x这个成员的“接口”。
最基本的封装其实就是不想让其他人员来直接操作属性或者说成员,然后
对外暴露一个函数或者接口来对指定的属性或者成员进行操作。
你的demo是符合最基本原理的。
作者: 公子文彬    时间: 2016-3-24 17:11
要pythonic,就是直接a.x=value来赋值,没有必要加个无实际过程的change方法。
作者: 小叶冰城    时间: 2016-3-25 11:32
公子文彬 发表于 2016-3-24 17:11
要pythonic,就是直接a.x=value来赋值,没有必要加个无实际过程的change方法。

有道理
作者: 小叶冰城    时间: 2016-3-25 11:34
Lurking 发表于 2016-3-23 22:56
第二种。没有违背。因为你用到了类,类是一种封装。
A类封装了成员x,并对x进行了初始化,也就是x的value ...

恩  非常感谢。。我还是觉得用A.x = value 破坏了封装特性,  只能说怪就怪该死的x是public
作者: 小叶冰城    时间: 2016-3-25 11:35
yangzuxun010 发表于 2016-3-23 17:33
选择 第二种

斑竹大人 why?
作者: 小叶冰城    时间: 2016-3-25 11:36
公子文彬 发表于 2016-3-24 17:11
要pythonic,就是直接a.x=value来赋值,没有必要加个无实际过程的change方法。

谢谢公子文彬
作者: Lurking    时间: 2016-3-26 15:53
本帖最后由 Lurking 于 2016-3-26 21:21 编辑

一般情况下,不要把类中的属性设为公共的,除非这个属性是当做一种标签需要在其他类中直接使用,抑或这个类专门用来存储一些公开的属性。




欢迎光临 openKylin论坛 (https://forum.openkylin.top/) Powered by Discuz! X3.3