我发现访问dict密钥更加方便,obj.foo而不是obj['foo'],所以我写了这个代码片段:
class AttributeDict(dict):
def __getattr__(self, attr):
return self[attr]
def __setattr__(self, attr, value):
self[attr] = value
Run Code Online (Sandbox Code Playgroud)
但是,我认为必须有一些原因,Python不提供开箱即用的功能.以这种方式访问dict密钥有什么警告和陷阱?
我想__eq__()为以下类创建一个通用方法.基本上我希望能够添加另一个属性(nick)而不必更改__eq__()
我想我可以通过迭代来以某种方式做到这一点,dir()但我想知道是否有办法创建一个只提供属性的理解.
class Person:
def __init__(self, first, last):
self.first=first
self.last=last
@property
def first(self):
assert(self._first != None)
return self._first
@first.setter
def first(self,fn):
assert(isinstance(fn,str))
self._first=fn
@property
def last(self):
assert(self._last != None)
return self._last
@last.setter
def last(self,ln):
assert(isinstance(ln,str))
self._last=ln
@property
def full(self):
return f'{self.first} {self.last}'
def __eq__(self, other):
return self.first==other.first and self.last==other.last
p = Person('Raymond', 'Salemi')
p2= Person('Ray', 'Salemi')
Run Code Online (Sandbox Code Playgroud) 如何复制复杂对象以便可以向其中添加新成员?当我尝试使用 deepcopy 时,它失败并显示“ TypeError: cannot serialize...”
最初的问题是我想向现有对象添加一些成员变量但不能,因为这样做会导致“ AttributeError: Object is fixed”
因此,想法是在具有添加成员的新类中创建原始对象的完整副本。
orig_obj = SomeSqlObject.get_root() # contents unclear, complex
class orig_expanded():
def __init__(self, replicable_object):
self.__dict__ = copy.deepcopy(replicable_object.__dict__)
self.added_member1 = None
self.added_list = []
expanded_thing = orig_expanded(orig_obj)
Run Code Online (Sandbox Code Playgroud)
但我得到:
TypeError: cannot serialize '_io.TextIOWrapper' object
Run Code Online (Sandbox Code Playgroud)
评论的后续回答,“什么是 SomeSqlObject?” 也许我的名字是错误的......公司的实际名称被混淆了。它是一种返回一个对象的方法,该对象表示(某种)树的基部该树被定义
class SomeSqlObject(ParentRegisterSet):
"""
Implements the functionality of the Device "root" Register Set.
"""
def __init__(self, db, v1, dg, ui):
self.__db__ = db
self.__dg__ = dg
self.__ui__ = ui
SomeSqlObject.__init__(self, v1, None)
# note: …Run Code Online (Sandbox Code Playgroud) 我想在Python中为User创建类似Pojo的类.每个属性都将涉及一些验证.例如:我不希望有人创建具有负值年龄的用户.为了实现这一点,我最终会写一个类似下面的课程.
class User:
def __init__(self, age):
self.age = age
@property
def age(self):
return self._age
@age.setter
def age(self, value):
print("Called")
if value >= 0:
self._age = 0
else:
raise ValueError("Age can't be negative")
Run Code Online (Sandbox Code Playgroud)
看到上面的课后我有点害怕.原因:
这是在Python中创建此类的正确方法吗?