相关疑难解决方法(0)

像属性一样访问dict键?

我发现访问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密钥有什么警告和陷阱?

python syntax dictionary

273
推荐指数
16
解决办法
16万
查看次数

Python中的通用__eq __()方法

我想__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)

python python-3.x

8
推荐指数
2
解决办法
275
查看次数

为什么在复制复杂对象时 deepcopy 会失败

如何复制复杂对象以便可以向其中添加新成员?当我尝试使用 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 object python-3.x

5
推荐指数
2
解决办法
6150
查看次数

Pojo喜欢Python中的类

我想在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)

看到上面的课后我有点害怕.原因:

  1. 我的用户类将有大约50'属性.我有点害怕想象在这种情况下这个班级会有多大.

这是在Python中创建此类的正确方法吗?

python class

0
推荐指数
1
解决办法
3216
查看次数

标签 统计

python ×4

python-3.x ×2

class ×1

dictionary ×1

object ×1

syntax ×1