鱼C论坛

 找回密码
 立即注册
查看: 769|回复: 3

[已解决]关于子类与父类继承的问题

[复制链接]
发表于 2019-6-10 20:58:41 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如果我有一个需求父类A在全局只初始化一次,初始化的时候会创建一个随机数的会话id;现在一个子类B继承于父类A;当我现在实列化B的时候如何能让父类A的实列完全继承下来,使所有子类能共用A的随机会话id,而不是重新创建一个新的会话id
最佳答案
2019-6-10 21:33:31
单例模式了解一下。
  1. import random


  2. class A:
  3.     _instance = {}
  4.    
  5.     def __new__(cls, *args, **kwargs):
  6.         if not cls._instance:
  7.            cls._instance['id'] = random.randint(1, 10)
  8.         # print(cls.id)
  9.         return super(A, cls).__new__(cls)


  10. class B(A):
  11.     pass


  12. class C(A):
  13.     pass


  14. class D(A):
  15.     pass


  16. b = B()
  17. c = C()
  18. d = D()

  19. print(b._instance['id'])
  20. print(c._instance['id'])
  21. print(d._instance['id'])
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-10 21:33:31 | 显示全部楼层    本楼为最佳答案   
单例模式了解一下。
  1. import random


  2. class A:
  3.     _instance = {}
  4.    
  5.     def __new__(cls, *args, **kwargs):
  6.         if not cls._instance:
  7.            cls._instance['id'] = random.randint(1, 10)
  8.         # print(cls.id)
  9.         return super(A, cls).__new__(cls)


  10. class B(A):
  11.     pass


  12. class C(A):
  13.     pass


  14. class D(A):
  15.     pass


  16. b = B()
  17. c = C()
  18. d = D()

  19. print(b._instance['id'])
  20. print(c._instance['id'])
  21. print(d._instance['id'])
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-10 21:50:57 | 显示全部楼层
°蓝鲤歌蓝 发表于 2019-6-10 21:33
单例模式了解一下。

感谢,确实是这样的,你这种方法是最好的。我也找到一种记录下;
  1. import random

  2. class A:
  3.     def __init__(self):
  4.         self.sj = str(random.random())
  5.         print('A初始化{}'.format(self.sj))
  6.         
  7.     def get(self):
  8.         return self.sj
  9.    
  10. class B(A):
  11.     def __init__(self):
  12.         super(B, self).__init__()
  13.         print('B初始化{}'.format(self.sj))
  14.    
  15.     def set(self, ss):
  16.         self.sj = ss
  17.     无标题.png
  18.         
  19. a = A()
  20. print(a.get())
  21. print(dir(a))
  22. a.__class__ = B
  23. print(a.get())
  24. a.set(str(random.random()))
  25. print(a.get())
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-11 23:32:35 | 显示全部楼层
°蓝鲤歌蓝 发表于 2019-6-10 21:33
单例模式了解一下。

大佬这个问题该怎么解决呢?
  1. import random

  2. class A:
  3.         def __init__(self):
  4.                 self._id = str(random.random())
  5.                 print('id {}'.format(self._id))

  6.         def aa(self):
  7.                 print(self._id)

  8. class B(A):
  9.         def __new__(cls, *args, **kwargs):
  10.                 if not hasattr(B, '_flag'):
  11.                         cls._flag = A.__new__(cls)
  12.                         return cls._flag
  13.                 # return super(B, cls).__new__(cls)
  14.                 """如果是上面这样返回,那么就并不能实现单类模式了创建的b,c实例id值不同"""
  15.                 return cls._flag
  16.                 """如果是这样返回那么继承自B类的方法都能实现单列,但是继承的类都不能调用自己的方法"""

  17.         def __init__(self):
  18.                 super(B, self).__init__()

  19.         def bb(self):
  20.                 pass

  21. class C(B):
  22.         def cc(self):
  23.                 pass

  24. b = B()
  25. c = C()
  26. d = B()

  27. b.aa()
  28. c.cc()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-8 15:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表