- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我有以下代码用于处理个人和国家/地区之间的链接:
from dataclasses import dataclass
@dataclass
class Country:
iso2 : str
iso3 : str
name : str
countries = [ Country('AW','ABW','Aruba'),
Country('AF','AFG','Afghanistan'),
Country('AO','AGO','Angola')]
countries_by_iso2 = {c.iso2 : c for c in countries}
countries_by_iso3 = {c.iso3 : c for c in countries}
@dataclass
class CountryLink:
person_id : int
country : Country
country_links = [ CountryLink(123, countries_by_iso2['AW']),
CountryLink(456, countries_by_iso3['AFG']),
CountryLink(789, countries_by_iso2['AO'])]
print(country_links[0].country.name)
这一切都很好,但我决定让它不那么笨拙,以便能够处理不同形式的输入。我还想使用
__new__
来确保我们每次都获得有效的 ISO 代码,并且我想反对在这种情况下无法创建。因此,我添加了几个继承自此的新类:
@dataclass
class CountryLinkFromISO2(CountryLink):
def __new__(cls, person_id : int, iso2 : str):
if iso2 not in countries_by_iso2:
return None
new_obj = super().__new__(cls)
new_obj.country = countries_by_iso2[iso2]
return new_obj
@dataclass
class CountryLinkFromISO3(CountryLink):
def __new__(cls, person_id : int, iso3 : str):
if iso3 not in countries_by_iso3:
return None
new_obj = super().__new__(cls)
new_obj.country = countries_by_iso3[iso3]
return new_obj
country_links = [ CountryLinkFromISO2(123, 'AW'),
CountryLinkFromISO3(456, 'AFG'),
CountryLinkFromISO2(789, 'AO')]
乍一看这似乎有效,但后来我遇到了一个问题:
a = CountryLinkFromISO2(123, 'AW')
print(type(a))
print(a.country)
print(type(a.country))
返回:
<class '__main__.CountryLinkFromISO2'>
AW
<class 'str'>
继承的对象具有正确的类型,但它的属性
country
只是一个字符串,而不是我期望的
Country
类型。我在
__new__
中放入了打印语句来检查
new_obj.country
的类型,并且在
return
行之前是正确的。
a
成为
CountryLinkFromISO2
类型的对象,它将继承我对
CountryLink
所做的更改,并使其具有从字典
country
中获取的属性
countries_by_iso2
。我怎样才能做到这一点?
最佳答案
仅仅因为数据类在幕后做,并不意味着你的类没有 __init__()
.他们这样做,看起来像:
def __init__(self, person_id: int, country: Country):
self.person_id = person_id
self.country = country
当您使用以下命令创建类时:
CountryLinkFromISO2(123, 'AW')
那个
"AW"
字符串被传递给
__init__()
并将值设置为字符串。
__new__()
以这种方式是脆弱的,并且从构造函数返回 None 是相当不pythonic的(imo)。也许你最好制作一个返回
None
的实际工厂函数。或者你想要的类(class)。那你就不用惹
__new__()
根本。
@dataclass
class CountryLinkFromISO2(CountryLink):
@classmethod
def from_country_code(cls, person_id : int, iso2 : str):
if iso2 not in countries_by_iso2:
return None
return cls(person_id, countries_by_iso2[iso2])
a = CountryLinkFromISO2.from_country_code(123, 'AW')
如果由于某种原因它需要使用
__new__()
, 您可以返回
None
没有匹配项时从新开始,并在
__post_init__()
中设置国家/地区:
@dataclass
class CountryLinkFromISO2(CountryLink):
def __new__(cls, person_id : int, iso2 : str):
if iso2 not in countries_by_iso2:
return None
return super().__new__(cls)
def __post_init__(self):
self.country = countries_by_iso2[self.country]
关于python - 在继承的数据类中使用 __new__,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68703741/
为什么下面的代码会出错? class Foo: def __new__(cls, *args, **kwargs): print("Creating Instance")
Documentation for object.__new__(cls[, ...]) says: Called to create a new instance of class cls. __
编码异常类,我遇到了这个错误: TypeError: object.__new__(A) 不安全,使用 Exception.__new__() 这里有一个类似的问题: TypeError: objec
以下是使用 PyCharm Community Edition 中的 Tkinter 在 Python 3.0 中对 Conway 的生命游戏的不完整实现。 程序由四个文件组成: Cell.py:包含
阅读本文时:What is a metaclass in Python? ,我正在学习使用 __new__ 使用以下代码段:- class a(object): pass a.__new__(
前言 我想要具有以下属性的 2 个类 Interval 和 Segment: Interval 可以有 start 和 end 点,它们中的任何一个都可以被包含/排除(我已经使用必需的标志参数实现了这
我知道当我们通过 super 方法调用父方法时,我们可以忽略绑定(bind)方法中的“self”参数,如下所示: class Foo(object): def __init__(self):
假设以下代码: class NumStorage(object): def __new__(cls, *nargs): name = cls.__name__
嗨,我一直收到这个错误,我不知道如何避免。 我有以下代码: class retrieve_account_data(Thread): _account_queue = None _di
假设我有一些调用 __new__ 的类,我如何才能很好地使用 mro 并根据需要调用父类(super class)的 __new__(带参数),但不使用附加参数调用 object.__new__?例如
我正在尝试像这样深度复制我的 igraph 对象: copy.deepcopy(graph) 其中 graph 是 igraph 对象,一个只有几个顶点的完整图。但是我得到这个错误: Fi
假设我有以下代码用于处理个人和国家/地区之间的链接: from dataclasses import dataclass @dataclass class Country: iso2 : st
我知道类是元类的实例,并且 __new__ 在 __init__ 之前运行,因为,您必须在初始化它之前创建一个实例。 现在想象一下: import time class ConfigurationsM
使用Python元类A创建一个新类B。 当C继承B时,为什么调用A的__new__方法? class A(type): def __new__(cls, name, bases, attrs)
案例1: class Person: def __new__(cls, *args, **kwargs): print "called" return supe
我可以知道为什么 myClass1 和 myClass2 在覆盖 __new__() 方法时表现不同吗?推荐使用哪种方式来编写类,为什么?我认为 myClass1(): 甚至没有调用 __new__(
当__new__返回类的实例时,一切正常,我们可以毫无问题地创建子类: class A: def __new__(cls, p1, p2): self = object.__n
如何编写默认的 __new__ 并进行一些小的更改,如下所示: class A: def __new__(cls, *args, **kwargs): retval = sup
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 8 年前。 Improve this qu
我一直在努力理解__new__ 和元编程。所以我看了一下官方的 python 源代码。 http://hg.python.org/cpython/file/2.7/Lib/fractions.py 分
我是一名优秀的程序员,十分优秀!