在尝试序列化我的类和子类时,在与一堆未捕获的异常进行摔跤之后,我终于明白了我的问题:当应用于基类时,[Serializable]不会被子类继承.我对C#属性一般都很模糊,但我确实理解在创建自定义属性时,程序员能够自动继承属性.
有没有办法覆盖[Serializable]的继承?有没有什么好的理由说明为什么从一开始就没有这样做和/或首先做一个坏主意?我希望所有基类的所有子类都是可序列化的,所以只需要将属性添加到我创建的任何新子类中似乎是不优雅的.
谢谢!
通过"计算"名称定义类属性时,如:
class C(object):
for name in (....):
exec("%s = ..." % (name,...))
Run Code Online (Sandbox Code Playgroud)
有没有一种处理众多属性定义的方法比使用exec?getattr(C,name)不起作用,因为在类构造期间没有定义C ...
所以有点忏悔,我从来没有写过属性类.我知道他们的目的是用标志或额外的功能来装饰类.
有人可以给我一个简单的例子,不仅可以创建属性并将其应用于类,而且可以使用另一个代码块中的属性.我见过的唯一使用任何形式属性的代码示例都是通过反射来实现的,尽管我一直希望有一种方法可以在没有反射的情况下使用它们.
我认为以下将抛出NullPointerException
class N {
static int i;
public static void main( String ... args ) {
System.out.println( ((N)null).i );
}
}
Run Code Online (Sandbox Code Playgroud)
但事实并非如此.为什么?
我想在classmethod中使用服务函数,其中服务函数在其他地方定义.我希望是动态的,所以我可以在不同的情况下定义不同的功能.我试过这个:
def print_a():
print 'a'
class A:
func = print_a
@classmethod
def apply(cls):
cls.func()
A.apply()
Run Code Online (Sandbox Code Playgroud)
但是我收到了这个错误:
unbound method print_a() must be called with A instance as first argument (got nothing instead)
任何想法如何使其工作?
似乎保留字不能在python中用作属性:
$ python
Python 3.6.2 |Continuum Analytics, Inc.| (default, Jul 20 2017, 13:51:32)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-1)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> class A:
>>> global = 3
File "<stdin>", line 2
global = 3
^
SyntaxError: invalid syntax
Run Code Online (Sandbox Code Playgroud)
这似乎是明智的,因为它是模棱两可的:我在global这里使用关键字吗?很难说。
但这不是明智的恕我直言:
>>> class A: pass
>>> a = A()
>>> a.global = 3
File "<stdin>", line 1
a.global = 3
^
SyntaxError: invalid syntax
>>> a.def = 4
File …Run Code Online (Sandbox Code Playgroud) 这是一个非常人为的例子,因为要解释我最终实现这个解决方案的背景并不容易.但是,如果有人能够回答为什么会发生这种特殊情况,我将不胜感激.
这个例子:
class A(dict):
def __init__(self):
self['a'] = 'success'
def __getitem__(self, name):
print 'getitem'
return dict.__getitem__(name)
class B(object):
def __init__(self):
self._a = A()
setattr(self, '__getitem__', self._a.__getitem__)
b = B()
c = b['a']
Run Code Online (Sandbox Code Playgroud)
这输出:
c = b['a']
TypeError: 'B' object is unsubscriptable
Run Code Online (Sandbox Code Playgroud)
即使这是一种奇怪的方式(显然子类化更合乎逻辑),为什么它找不到我明确设置的方法?
如果我这样做:
dir(b)
Run Code Online (Sandbox Code Playgroud)
我明白了:
['__class__', '__delattr__', '__dict__', '__doc__', '__getattribute__', '__getitem__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', '__weakref__', '_a']
Run Code Online (Sandbox Code Playgroud)
其他方法也会出现同样的问题__iter__.明确定义这个有效的方法是什么意思?
例:
class A:
a = 1
class B(A):
b = 2
y = b # works fine
x = a # NameError: name 'a' is not defined
x = A.a # works fine
z = B()
z.a # works fine
B.a # works fine
Run Code Online (Sandbox Code Playgroud)
为什么x = a不允许?在每个其他上下文中(通过实例访问,通过子类名称访问)它工作正常; 但不知何故,在课堂内部,它不起作用.
并且考虑到这种行为,我似乎无法实现一个类层次结构,其中每个类定义了一些额外的属性 - 因为我不能在子类中访问它们而不知道它们在层次结构中的确切位置.
这是我正在尝试(不成功)做的事情:
class X:
accelerate = compose(f1, f2, f3) # f1, f2, f3 are functions
class Y(X):
move = compose(f4, f5)
stop = f6
class Z(Y):
action = …Run Code Online (Sandbox Code Playgroud) 我有一个django模型,需要参考自定义用户模型进行一些处理。
在类加载时,我无法使用此模型的类,因为类的加载顺序是未知的。
因此,我需要在运行时添加一些类属性,此刻,我需要将它们添加到中__init__或__new__类似的地方:
def __new__(cls, *args, **kwargs):
# hack to avoid INSTALLED_APPS initialization conflicts.
# get_user_model() can't be called from this module at class loading time,
# so some class attributes must be added later.
# Metaclasses could me more appropiate but I don't want to override
# dango's metaclasses.
if not hasattr(cls, '_reverse_field_name_to_user'):
cls._find_reverse_field_name_to_user()
return Group.__new__(cls, *args, **kwargs)
Run Code Online (Sandbox Code Playgroud)
它可以工作,但是看起来很可怕,所以我考虑过@lazyclassproperty对这些属性使用类似的东西。
我已经发现了几个@classproperty和@lazyproperty装修而不是一个两个,我不知道如何写一个自己。
问题:如何编码这样的装饰器?或建议另一种更清洁的方法替代我目前的愚蠢实施。
看看下面的代码。
我想使用 的值a作为cclassmethod 声明中参数的默认值my_method()。
我该怎么做?下面的例子失败了。
>>> class X:
... a = 'hello'
... def __init__(self, b):
... self.b = b
... @classmethod
... def my_method(cls, c=X.a):
... print 'cls.a = {}'.format(cls.a)
... print 'c = {}'.format(c)
...
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 6, in X
NameError: name 'X' is not defined
Run Code Online (Sandbox Code Playgroud) class-attributes ×10
python ×7
attributes ×2
c# ×2
class ×1
class-method ×1
decorator ×1
django ×1
exec ×1
java ×1
namespaces ×1
oop ×1
python-3.x ×1