【问题标题】:How is it possible that a Python built-in data type can have attributes that have the same data type?Python 内置数据类型怎么可能具有相同数据类型的属性?
【发布时间】:2020-08-25 11:54:51
【问题描述】:

显然这在Python代码中是做不到的,比如

class Foo:
    a = Foo()

但是在创建语言本身时,他们是如何设计的呢?

示例包括具有realimagnumeratordenominator 属性的intstr__doc__;方法有自己的方法,type 是自己的元类。

如果您尝试使用 Python 代码复制类似的内容,他们如何解决递归问题?

【问题讨论】:

  • 我不知道这是否回答了你的问题,但在内部我认为所有这些都是PyObject*s?在 C 中你不能这样做的原因是默认情况下事物不是指针。指针可以让你在不使对象无限大的情况下做到这一点。
  • 请记住,Python 字符串可以只是 C 字符串的包装器、C 整数的 Python 整数包装器等。不需要在实例化时预先创建所有可能的属性;一个只需要单一的支持值。
  • 你当然可以让 Python 中的 Foo.a 成为另一个 foo。同样的规则适用——在运行时创建它,或者在引导之后等。
  • 无论如何,您遇到的具体问题是什么,此答案将帮助您解决?仅仅基于好奇心的问题在这里通常是题外话;帮助中心指南要求问题要实用——也就是说,要对你如何进行编程实践产生具体影响。

标签: python c recursion types


【解决方案1】:

不确定这是否符合您需要实现的目标。
但是一个巧妙的解决方法可能是使用 @property 装饰器?

class Foo:

    @property
    def a(self):
        return Foo()

x = Foo()
print(x)
print(x.a)
print(type(x) == type(x.a) == Foo)


<__main__.Foo object at 0x033083B8>
<__main__.Foo object at 0x033081D8>
True

从技术上讲,这可以让您绕过递归。严格来说,它不会立即创建第二个实例,所以如果这是您需要考虑的一个因素,我的或 Amitai 的答案都不会为您做到这一点。但它会在实例创建时创建一个名为 a 的属性,但在您访问它之前不会执行任何操作。

【讨论】:

  • OP 并没有询问如何在他们自己的代码中实现某些东西;问题是问 CPython 是如何实现一件事的。
  • @CharlesDuffy Yepp 和 this is one way 他们这样做了。或者至少那是我从源代码中收集到的。还有here's 一些关于该主题的更多信息。
【解决方案2】:

嗯,你的假设并不完全正确。创建班级后,您可以分配给班级成员。考虑以下几点:

# Class definition
class Foo:

    foo = None

    def the_foo(self):
        return Foo.foo

# Assigning to the class member
Foo.foo = Foo()

# Creating an object and accessing class member through an object method
a_foo = Foo()
print("type(a_foo.the_foo()) =", type(a_foo.the_foo()))

这会产生:

type(a_foo.the_foo()) = <class '__main__.Foo'>

那么,如果这可以在 Python 中完成,为什么不能在内置类中完成呢?

【讨论】:

  • 这是真的,但它也没有特别回答有关 CPython 如何工作的问题。 (intstring 类型是用 C 实现的,根本不是原生 Python)。
  • 它确实回答了这个问题,即“这怎么可能?”而不是“它是如何完成的?”。前提是,由于 Python 不允许构造,它的 C 实现肯定也不允许它。我证明了最初的假设是不正确的,因此这一点没有实际意义。也有可能表明该假设不会导致结论,但我没有为此烦恼。
猜你喜欢
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 2021-02-12
  • 2013-02-26
  • 1970-01-01
  • 2020-01-23
  • 1970-01-01
  • 2021-07-24
相关资源
最近更新 更多