我有以下大块的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"的值.
我知道这是在类和实例上定义的密码,但我不知道如何正确表示它,所以它的工作原理.任何帮助,将不胜感激.
类的集合定义为:
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的子类,有人可以告诉我这里出了什么问题,以及我如何改变我正在做的删除错误的方法?
码:
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)
检查对象是否为新式类的用户定义类的实例的正确方法是什么?
如果检查对象的类型是否是用户定义的,我想要额外强调.根据文件:
types.InstanceType 用户定义的类
的实例类型.
好吧 - 不是"正确"的方式也可以.
还注意到set模块中没有类型types
我最近曾说过尝试在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=[...], ...) …
我正在尝试创建一个定义名为"坐标"的属性的点类.但是,它的表现并不像我期望的那样,我无法弄清楚原因.
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"应该"设置这些值.谁知道为什么会这样?
这是一个旧式的课程:
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)
有没有任何区别之间NewStyle和NewStyle2?
我的印象是继承的唯一影响object实际上是定义type元类,但我找不到任何确认,除此之外我没有看到任何区别.
我正在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 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)
为什么两者的实例A和B实例object?
如果B是一个实例object,那么type(B)不会 …
我正在学习Python,我试图更好地理解描述符.当我查看这个Python在线书籍时:http://www.cafepy.com/article/python_attributes_and_methods/ch01s05.html,它说:
我不明白Python提供的意思.有人能给我一个这样的Python提供的属性的例子,该属性优先于通常的解析顺序吗?
注意:我只对新式类感兴趣(据我所知,描述符甚至不适用于旧式).
我想创建一个抽象工厂,以便抽象 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) new-style-class ×10
python ×10
class ×2
descriptor ×2
python-2.7 ×2
future ×1
init ×1
metaclass ×1
oop ×1
properties ×1
python-2.x ×1
python-3.x ×1
setter ×1
typeerror ×1