标签: new-style-class

如何从__init__调用属性设置器

我有以下大块的python代码:

import hashlib

class User:
    def _set_password(self, value):
        self._password = hashlib.sha1(value).hexdigest()

    def _get_password(self):
        return self._password

    password = property(
        fset = _set_password,
        fget = _get_password)

    def __init__(self, user_name, password):
        self.password = password

u = User("bob", "password1")
print(u.password)
Run Code Online (Sandbox Code Playgroud)

理论上应该打印出密码的SHA1,但是从构造函数设置self.password会忽略已定义的属性,只需将值设置为"password1"即可.然后print语句读取"password1"的值.

我知道这是在类和实例上定义的密码,但我不知道如何正确表示它,所以它的工作原理.任何帮助,将不胜感激.

python setter init new-style-class

10
推荐指数
1
解决办法
2767
查看次数

TypeError:调用元类基类时出错新样式类不能只有经典基类

类的集合定义为:

class A():
    @staticmethod
    def call():
        print('a')

class C(type):
    def __repr__(self):
        return 'somename'

class B(A):
    __metaclass__ = C

    @staticmethod
    def call():
        print('b')

    def boundcall(self):
        print('bound')
Run Code Online (Sandbox Code Playgroud)

运行时,会出现此错误:

TypeError: Error when calling the metaclass bases
    a new-style class can't have only classic bases
Run Code Online (Sandbox Code Playgroud)

我需要元类(我认为)在我的代码中有一个已知的B字符串表示.有这个原因的原因不是重点,但它对未来的更新有很大帮助.

因此,假设我需要C作为B的元类,B将是A的子类,有人可以告诉我这里出了什么问题,以及我如何改变我正在做的删除错误的方法?

python oop typeerror new-style-class

10
推荐指数
1
解决办法
2万
查看次数

如何检查对象是否是新式用户定义类的实例?

码:

import types


class C(object):
    pass


c = C()
print(isinstance(c, types.InstanceType))
Run Code Online (Sandbox Code Playgroud)

输出:

False
Run Code Online (Sandbox Code Playgroud)

检查对象是否为新式类的用户定义类的实例的正确方法是什么?

UPD:

如果检查对象的类型是否是用户定义的,我想要额外强调.根据文件:

types.InstanceType 用户定义的
的实例类型.

UPD2:

好吧 - 不是"正确"的方式也可以.

UPD3:

还注意到set模块中没有类型types

python python-2.x new-style-class

9
推荐指数
2
解决办法
3512
查看次数

使用类实例作为类属性,描述符和属性

我最近曾说过尝试在Python中使用更新的类(从对象派生的类).作为熟悉它们的例外,我试图定义一个类,它有许多类实例作为属性,每个类实例描述不同类型的数据,例如1d列表,2d数组,标量等.基本上我希望能够写作

some_class.data_type.some_variable
Run Code Online (Sandbox Code Playgroud)

where data_type是一个描述变量集合的类实例.下面是我第一次尝试实现它,只使用一个profiles_1d实例而非通用名称:

class profiles_1d(object):
    def __init__(self, x, y1=None, y2=None, y3=None):
        self.x = x
        self.y1 = y1
        self.y2 = y2
        self.y3 = y3

class collection(object):
    def __init__(self):
        self._profiles_1d = None

    def get_profiles(self):
        return self._profiles_1d

    def set_profiles(self, x, *args, **kwargs):
        self._profiles_1d = profiles_1d(x, *args, **kwargs)

    def del_profiles(self):
        self._profiles_1d = None

    profiles1d = property(fget=get_profiles, fset=set_profiles, fdel=del_profiles,
        doc="One dimensional profiles")
Run Code Online (Sandbox Code Playgroud)

以上代码大致是解决此问题的适当方法.我看到的使用的例子property只是设置了一些变量的值.在这里,我需要使用set方法初始化某个类的实例.如果没有,将非常感谢任何其他更好的方法来实现这一点的建议.

另外,我定义set方法的方式是否正确?通常,根据我的理解,set方法定义了用户键入时要执行的操作,在此示例中,

collection.profiles1d = ...
Run Code Online (Sandbox Code Playgroud)

我可以profiles_1d使用上面的代码正确设置实例属性的唯一方法是键入collection.set_profiles([...], y1=[...], ...),但我认为我不应该直接调用此方法.理想情况下我想输入collection.profiles = ([...], y1=[...], ...) …

python properties class descriptor new-style-class

8
推荐指数
1
解决办法
487
查看次数

Python对象@property

我正在尝试创建一个定义名为"坐标"的属性的点类.但是,它的表现并不像我期望的那样,我无法弄清楚原因.

class Point:
    def __init__(self, coord=None):
        self.x = coord[0]
        self.y = coord[1]

    @property
    def coordinate(self):
        return (self.x, self.y)

    @coordinate.setter
    def coordinate(self, value):
        self.x = value[0]
        self.y = value[1]

p = Point((0,0))
p.coordinate = (1,2)

>>> p.x
0
>>> p.y
0
>>> p.coordinate
(1, 2)
Run Code Online (Sandbox Code Playgroud)

似乎px和py由于某种原因没有设置,即使setter"应该"设置这些值.谁知道为什么会这样?

python new-style-class

6
推荐指数
1
解决办法
1146
查看次数

从对象继承的子类与将类型定义为元类相同吗?

这是一个旧式的课程:

class OldStyle:
    pass
Run Code Online (Sandbox Code Playgroud)

这是一个新式的课程:

class NewStyle(object):
    pass
Run Code Online (Sandbox Code Playgroud)

这也是一个新风格的类:

class NewStyle2:
    __metaclass__ = type
Run Code Online (Sandbox Code Playgroud)

有没有任何区别之间NewStyleNewStyle2

我的印象是继承的唯一影响object实际上是定义type元类,但我找不到任何确认,除此之外我没有看到任何区别.

python new-style-class python-2.7 python-internals

6
推荐指数
1
解决办法
69
查看次数

从builtins导入对象只影响一个类

我正在newstyle使用python2将代码从python2转换为python3 future.我的项目是Django 1.11

我在forms.py中有一个类:

class Address:
    ...rest of code...

class AddressForm(Address, forms.ModelForm):
    ...rest of code...
Run Code Online (Sandbox Code Playgroud)

在Python 2中

转换为:

from buitlins import object
class Address(object):
        ...rest of code...

class AddressForm(Address, forms.ModelForm):
    ...rest of code...
Run Code Online (Sandbox Code Playgroud)

在Python 3中

我有一个selenium测试,在转换为Python3后调用此Form时失败,并出现以下错误:

File "<path_to_venv>/local/lib/python2.7/site-packages/django/utils/six.py", line 842, in <lambda>
klass.__str__ = lambda self: self.__unicode__().encode('utf-8')
File "<path_to_venv>/local/lib/python2.7/site-packages/future/types/newobject.py", line 78, in __unicode__
s = type(self).__str__(self)
RuntimeError: maximum recursion depth exceeded
Run Code Online (Sandbox Code Playgroud)

但是,当我删除导入时from buitlins import object,测试通过.

但是,由于我添加了一个未来的检查,我得到了一个未来的差异错误,因此每个班级都必须转换为newstyle.我希望它可以在Python2和Python3中工作.

有没有办法这个模块builtins模块导入只能影响一个类而不影响forms.py文件中的其他类.还是有其他方法来处理这个?

python future new-style-class python-2.7 python-3.x

6
推荐指数
1
解决办法
192
查看次数

旧式类,新式类和元类

在Python 2.x中,所有新样式类都是object隐式或显式继承的.然后看看这个:

>>> class M(type):
...     pass
...
>>> class A:
...     __metaclass__ = M
...
>>> class B:
...     pass
...
>>> a = A()
>>> b = B()
Run Code Online (Sandbox Code Playgroud)
>>> type(A)
<class '__main__.M'>
>>> type(a)
<class '__main__.A'>
Run Code Online (Sandbox Code Playgroud)

这是否意味着A是一种新式的课程?但是不管怎样A都没有继承object,对吧?

>>> type(B)
<class 'classobj'>
>>> type(b)
<type 'instance'>
Run Code Online (Sandbox Code Playgroud)

好的,B是经典课,不是吗?

>>> isinstance(A, object)
True
>>> isinstance(B, object)
True
Run Code Online (Sandbox Code Playgroud)

为什么两者的实例AB实例object

如果B是一个实例object,那么type(B)不会 …

python metaclass class new-style-class

5
推荐指数
1
解决办法
705
查看次数

描述符和python提供的属性

我正在学习Python,我试图更好地理解描述符.当我查看这个Python在线书籍时:http://www.cafepy.com/article/python_attributes_and_methods/ch01s05.html,它说:

  1. 如果attrname是objectname的特殊(即Python提供的)属性,则返回它.

我不明白Python提供的意思.有人能给我一个这样的Python提供的属性的例子,该属性优先于通常的解析顺序吗?

注意:我只对新式类感兴趣(据我所知,描述符甚至不适用于旧式).

python descriptor new-style-class

5
推荐指数
1
解决办法
322
查看次数

从 python Abstract Factory 中导入

我想创建一个抽象工厂,以便抽象 Python 2.7 中计算机(例如 RaspberryPi 和 Arduino)之间的硬件差异。

我正在使用以下抽象工厂的实现:

  '''
  Provide a device-agnostic display interface
  '''
  from hardware import sysname

  class DisplayBase(object):
        def __init__(self):
           pass

        def show(self, message):
           pass

        def __str__(self):
           return "DisplayBase"

        def __repr__(self):
           return self.__str__()

   class RPIDisplay(DisplayBase):
        def __new__(cls, *args, **kwargs):
            from rpi_display import writeline
            instance = super(RPIDisplay, cls).__new__(cls, *args, **kwargs)
            return instance

        def __str__(self):
            return "RPIDisplay"

       def show(self, message):
           writeline(message)

    class ArduinoDisplay(DisplayBase):
        def __new__(cls, *args, **kwargs):
            import arduino_display
            instance = super(ArduinoDisplay, cls).__new__(cls, *args, **kwargs)
            return instance

        def __str__(self): …
Run Code Online (Sandbox Code Playgroud)

python new-style-class abstract-factory

5
推荐指数
1
解决办法
509
查看次数