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

2013-05-21 19:42:07 +08:00
 tcsky
我需要在socket.socket上扩展,增加了一些数据属性

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


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

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

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

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

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

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

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

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


实际现在在实现的就是一个异步非阻塞 的自定义协议的socket tcp服务器,
tcsky
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
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
2013-05-21 23:32:23 +08:00
~~~~~~~~~~~~帖子过期~~~~~~~~~~~~
——————————————————-


方法考虑有误~ , 即使成功,后期会出现一堆不匹配,根本没法做到正确对应
tcsky
2013-05-21 23:34:00 +08:00
尝试 设一个列表,与socket的列表相对应,用同意ID 关联两组数据~~
myspring
2013-05-22 11:06:48 +08:00
成都高薪求python开发工程师,有意向者请留言,或发简历到monica.hu@mokitech.com,或加qq:2680622700详聊,请注明

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/69668

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX