我正在学习Python和到目前为止,我可以告诉低于约的事情__new__和__init__:
__new__ 用于创建对象__init__ 用于对象初始化__new__被调用之前__init__为__new__返回一个新的实例,并__init__随后调用初始化内部状态.__new__对于不可变对象是有益的,因为它们一旦被分配就无法更改.所以我们可以返回具有新状态的新实例.__new__和__init__为两个可变对象,因为它的内部状态可以改变.但我现在还有另外一个问题.
a = MyClass("hello","world"),如何传递这些参数?我的意思是我应该如何构造类__init__,__new__因为它们是不同的,并且除了默认的第一个参数之外都接受任意参数.self关键字在名称方面可以改为别的吗?但我想知道cls在名称方面可能会改变其他东西,因为它只是一个参数名称?我做了一些实验,如下:
>>> class MyClass(tuple):
def __new__(tuple):
return [1,2,3]
Run Code Online (Sandbox Code Playgroud)
我在下面做了:
>>> a = MyClass()
>>> a
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
虽然我说我想回来tuple,但这段代码运行正常并且还给了我[1,2,3].我知道在__new__调用函数后,我们将第一个参数作为我们想要接收的类型传递.我们说的是New功能对吗?我不知道除绑定类型以外的其他语言返回类型?
我也做了其他事情:
>>> issubclass(MyClass,list)
False
>>> issubclass(MyClass,tuple)
True
>>> isinstance(a,MyClass)
False
>>> isinstance(a,tuple)
False
>>> isinstance(a,list) …Run Code Online (Sandbox Code Playgroud) 我在python中遇到一个奇怪的错误,其中使用__new__类的方法作为工厂将导致__init__实例化类的方法被调用两次.
这个想法最初是使用__new__母类的方法根据传递的参数返回她的一个孩子的特定实例,而不必在类之外声明工厂函数.
我知道使用工厂功能将是这里使用的最佳设计模式,但是在项目的这一点上改变设计模式将是昂贵的.因此我的问题是:有没有办法避免双重调用__init__并__init__在这种模式中只获得一次调用?
class Shape(object):
def __new__(cls, desc):
if cls is Shape:
if desc == 'big': return Rectangle(desc)
if desc == 'small': return Triangle(desc)
else:
return super(Shape, cls).__new__(cls, desc)
def __init__(self, desc):
print "init called"
self.desc = desc
class Triangle(Shape):
@property
def number_of_edges(self): return 3
class Rectangle(Shape):
@property
def number_of_edges(self): return 4
instance = Shape('small')
print instance.number_of_edges
>>> init called
>>> init called
>>> 3
Run Code Online (Sandbox Code Playgroud)
任何帮助非常感谢.
我经常看到这个词,我可能已经在代码和库中使用了它,但我从来没有真正得到它.在我看到的大多数写作中,他们只是希望你能弄明白.
什么是班级工厂?有人可以解释这个概念吗?
我想在python中创建一个类,它应该像这样工作:
分配的数据,可能绑定到变量(例如a = exampleclass(data)或只是exampleclass(data))
插入数据后,它应自动确定数据的某些属性,如果某些属性已满,则会自动...
...将班级改为另一班级
第3部分是我遇到问题的部分.我如何真正改变班级内的课程?例如:
如果我有两个班,一个是Small_Numbers,另一个是Big_numbers; 现在我希望任何small_number小于1000的转移到a Big_number,反之亦然,testcode:
a = Small_number(50)
type(a) # should return Small_number.
b = Small_number(234234)
type(b) # should return Big_number.
c = Big_number(2)
type(c) # should return Small_number.
Run Code Online (Sandbox Code Playgroud)
这可能吗?
我有一个基类,它有一个方法,创建一个子类的实例,调用与输入字符串相同.
之前通过将子类和基类放在同一个文件中,并执行类似的操作globals()[name].
但是,现在,我已将子类拆分为其他文件.它们每个都import base在顶部有一个语句,所以我不能简单地在我的基类中导入子类,或者只有一个循环导入链.
这有什么解决方法吗?
在base.py中:
from basefactory import BaseFactory
class Base:
def __init__(self, arg1, arg2):
...
def resolve(self, element):
className = typing.getClassName(element)
return BaseFactory.getInstance(className, element, self)
Run Code Online (Sandbox Code Playgroud)
在basefactory.py中:
from file1 import *
from file2 import *
...
class BaseFactory:
@staticmethod
def getInstance(name, arg1, arg2):
subclass = globals()[name]
return subclass(arg1, arg2)
Run Code Online (Sandbox Code Playgroud)
在file1.py中:
from base import Base
class subclass1(Base):
def foo(self):
return self.arg1
Run Code Online (Sandbox Code Playgroud) 我有一个基类,我想从中创建许多子类.子类的不同之处仅在于在实例化期间用于调用基类的参数.下面的示例显示了如何创建子类Apple.有没有办法以编程方式执行此操作,而无需编写子类的__init__方法?这似乎是元类的工作,但在这种情况下我无法修改基类.
apple = {'color': 'red', 'shape': 'sphere'}
pear = {'color': 'yellow', 'shape': 'cone'}
melon = {'color': 'green', 'shape': 'prolate'}
class Fruit(object):
def __init__(self, color, shape):
self.color = color
self.shape = shape
class Apple(Fruit):
def __init__(self):
Fruit.__init__(self, **apple)
Run Code Online (Sandbox Code Playgroud) python ×5
class ×3
inheritance ×2
base ×1
class-design ×1
dynamic ×1
factory ×1
import ×1
python-3.x ×1
subclass ×1