【问题标题】:Class in class in python - access to motherclasspython中的类中的类-访问母类
【发布时间】:2014-12-02 23:38:40
【问题描述】:

我正在研究计算机代数并尝试为字段创建接口。 尽量不让你厌烦所有的细节,这就是我试图开始工作的原因:

class PrimeField():
  prime = 2
  def __init__(self,p):
     self.prime = p

  class element():
     def __init__(self,n):
        self.descriptor = n

     def someFunctionOfNandP(self):
         return 2*self.n % self.parrent.p

  field = PrimeField(7)
  el = field.element(5)
  print(el.someFunctionOfNandP())

我试图实现的是 PrimeField 创建一个生成器,你可以创建一个生成器,它使元素(对象)的功能依赖于来自的字段。 尽管我可以想到使用不同结构的解决方法(例如,制作一个通用元素类,该类采用两个元素和一个在初始化这些元素的字段中的函数),但由于与基础数学相似,上面显示的行中的某些内容会优先考虑该程序是为其他数学家编写的。

这可以做到吗?如果可以,怎么做?

谢谢

【问题讨论】:

  • element 与 PrimeField 有什么关系,需要在 PrimeField 的代码块中定义它?
  • 仍在尝试解决这个问题 - 但也许Inner Classes: How can I get the outer-class object at construction time? 的答案之一会有所帮助。哦,也许是__metaclass__。
  • nested classes python 搜索有很多有趣的想法/答案——除了“不要这样做”。 stackoverflow.com/a/1765716/2823755
  • 你的意思是def someFunctionOfNandP(self): return 2*self.descriptor % self.parrent.prime?
  • elementfield 是否需要访问PrimeField 类属性或绑定实例属性?

标签: python class


【解决方案1】:

一种可能性是将PrimeField 和PrimeFieldElement 视为单独的对象:

class PrimeFieldElement():

    def __init__(self, p, n):
        self.p = p
        self.n = n

    def someFunctionOfNandP(self):
         return 2 * self.n % self.p


class PrimeField():
    prime = 2

    def __init__(self, p):
        self.prime = p

    def element(self, n):
        return PrimeFieldElement(self.prime, n)

field = PrimeField(7)
el = field.element(5)
print(el.someFunctionOfNandP())

这似乎最符合您的要求:每次调用.element() 都会产生一个新元素,并且其中会存储p 和n 的值。也可以将PrimeField 与它一起传递并在PrimeFieldElement 内部访问它:

def element(self, n):
    return PrimeFieldElement(self, n)

与:

class PrimeFieldElement():

    def __init__(self, field, n):
        self.field = field
        self.n = n

    def someFunctionOfNandP(self):
         return 2 * self.n % self.field.prime

【讨论】:

    猜你喜欢
    • 2018-10-21
    • 1970-01-01
    • 2018-07-15
    • 2019-03-23
    • 2022-10-24
    • 2021-11-16
    • 2014-02-08
    • 2021-07-23
    • 1970-01-01
    相关资源
    最近更新 更多