V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
tcsky
V2EX  ›  Python

[待解决] python中如何将父类对象转换为子类对象

  •  
  •   tcsky ·
    tiancheng91 · 2013-05-21 19:42:07 +08:00 · 11502 次点击
    这是一个创建于 4203 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我需要在socket.socket上扩展,增加了一些数据属性

    class MySocket(socket.socket):
    def __init__(self, p):
    #待添加代码部分
    self.flag = 0


    如何将一个socket对象转换为MySocket类型的? 擦 找半天没找到~

    connection, client_address = s.accept()
    sock_my = MySocket(connection) # 如何实现?
    18 条回复    1970-01-01 08:00:00 +08:00
    ljbha007
        1
    ljbha007  
       2013-05-21 19:46:05 +08:00   ❤️ 1
    如果socket的类型本来就是MySocket 那么不需要转换
    如果socket的类型不是MySocket 那么无法转换(其他语言也不可以)
    tcsky
        2
    tcsky  
    OP
       2013-05-21 19:55:37 +08:00
    @ljbha007 感觉是把socket对象内存里的值送一份给MySocket,MySocket额外添加一些属性值,部分语言里是可以实现的~ python里不知道,python里有没有对象复制之类的方法?
    swulling
        3
    swulling  
       2013-05-21 20:00:47 +08:00
    抽象一下lz的问题。

    A是父类,B是A的子类,包含A的全部属性。

    现有有个父类A的实例化对象a,问如何建立B的实例化对象b,使b有a的全部属性
    swulling
        4
    swulling  
       2013-05-21 20:06:25 +08:00
    一个方法是
    b.__dict__ = a.__dict__

    如果想复制,加copy
    keakon
        5
    keakon  
       2013-05-21 20:15:29 +08:00
    如果你知道 socket 内部的实现,直接对 self 进行 init,再对增加的属性赋值即可。

    如果不清楚的话,用组合代替继承吧。
    ipconfiger
        6
    ipconfiger  
       2013-05-21 20:27:05 +08:00
    用继承就是大坑,直接
    def wrap(socket):
    setattr(socket,'flag',0)
    #init 里要做的事情

    sock = wrap(socket) 这样就ok了嘛
    tcsky
        7
    tcsky  
    OP
       2013-05-21 20:54:00 +08:00
    @ipconfiger setattr只能设置类公共属性, 直接socket.socket.flag = 0 就能设置,对具体的实例对象无效~
    tcsky
        8
    tcsky  
    OP
       2013-05-21 21:05:28 +08:00
    @swulling __dict__ 我试了下,怎么具体实例对象没有__dict__,而且__dict__维护的属性好像是类公共的部分,然后乱七八糟的看不懂了~
    binux
        9
    binux  
       2013-05-21 21:11:22 +08:00   ❤️ 1
    包装而不是继承
    class MySocket(object):
    def __init__(self, p):
    self.p = p

    调用socket的方法的时候self.p.foo
    然后在MySocket上拓展你的方法
    ipconfiger
        10
    ipconfiger  
       2013-05-21 21:12:05 +08:00
    @tcsky 实例对象是可以用setattr设置的,其实动态类型根本不需要继承这么死板的方式,而且你这里的需求和继承是正好相反的。
    swulling
        11
    swulling  
       2013-05-21 21:18:35 +08:00
    @tcsky 用@binux的方法吧,实际使用挺好用的
    tcsky
        12
    tcsky  
    OP
       2013-05-21 21:31:52 +08:00
    @binux 谢谢~ 完美解决~
    tcsky
        13
    tcsky  
    OP
       2013-05-21 21:51:19 +08:00
    @binux 额 悲剧的,好像还有些问题,我现在需要的实现是select维护多个socket连接,通过为每个socket连接添加额外的属性标志,使得每一次select里能依据socket属性 读取不同位数和不同的数据解包方式。
    select 返回的都是socket对象。


    实际现在在实现的就是一个异步非阻塞 的自定义协议的socket tcp服务器,
    tcsky
        14
    tcsky  
    OP
       2013-05-21 21:57:29 +08:00
    擦~ 标题没法修改了,还以为能修改说~

    暂时没找到方法,晚上试下其他途径实现目标。

    python中 class 类型转换相关的,暂时只找到这个

    class A(object):
    pass

    class B(A):
    def __add__(self, other):
    return self.value + other


    a = A()
    a.value = 5

    a.__class__ = B

    print a + 10

    直接修改__class__属性
    适用于两个类都是自定义的,估计还要简单点的,最后不一定成功的~
    详细的 http://stackoverflow.com/questions/8062161/can-i-dynamically-convert-an-instance-of-one-class-to-another
    tcsky
        15
    tcsky  
    OP
       2013-05-21 23:08:29 +08:00
    @ipconfiger 谢谢帮忙,我刚刚查了下 ,需要用setattr 需要有__dict__ 属性

    You can add attributes to any object that has a __dict__.

    x = object() doesnt't have it for example.
    Strings and other simple objects also don't have it
    Classes using __slots__ also do not have it.
    Classes defined with class have it unless the latter applies

    socket 有的是 __slots__ 正在继续看~
    tcsky
        16
    tcsky  
    OP
       2013-05-21 23:32:23 +08:00
    ~~~~~~~~~~~~帖子过期~~~~~~~~~~~~
    ——————————————————-


    方法考虑有误~ , 即使成功,后期会出现一堆不匹配,根本没法做到正确对应
    tcsky
        17
    tcsky  
    OP
       2013-05-21 23:34:00 +08:00
    尝试 设一个列表,与socket的列表相对应,用同意ID 关联两组数据~~
    myspring
        18
    myspring  
       2013-05-22 11:06:48 +08:00
    成都高薪求python开发工程师,有意向者请留言,或发简历到monica.hu@mokitech.com,或加qq:2680622700详聊,请注明
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2821 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 05:51 · PVG 13:51 · LAX 21:51 · JFK 00:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.