相关疑难解决方法(0)

Python中的__new__和__init__

我正在学习Python和到目前为止,我可以告诉低于约的事情__new____init__:

  1. __new__ 用于创建对象
  2. __init__ 用于对象初始化
  3. __new__被调用之前__init____new__返回一个新的实例,并__init__随后调用初始化内部状态.
  4. __new__对于不可变对象是有益的,因为它们一旦被分配就无法更改.所以我们可以返回具有新状态的新实例.
  5. 我们可以使用__new____init__为两个可变对象,因为它的内部状态可以改变.

但我现在还有另外一个问题.

  1. 当我创建一个新实例时a = MyClass("hello","world"),如何传递这些参数?我的意思是我应该如何构造类__init__,__new__因为它们是不同的,并且除了默认的第一个参数之外都接受任意参数.
  2. 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 class

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

使用类'__new__方法作为工厂:__ init__被调用两次

我在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 inheritance design-patterns class-design

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

什么是班级工厂?

我经常看到这个词,我可能已经在代码和库中使用了它,但我从来没有真正得到它.在我看到的大多数写作中,他们只是希望你能弄明白.

什么是班级工厂?有人可以解释这个概念吗?

factory class

32
推荐指数
3
解决办法
3万
查看次数

插入数据后更改类的类类型

我想在python中创建一个类,它应该像这样工作:

  1. 分配的数据,可能绑定到变量(例如a = exampleclass(data)或只是exampleclass(data))

  2. 插入数据后,它应自动确定数据的某些属性,如果某些属性已满,则会自动...

  3. ...将班级改为另一班级

第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)

这可能吗?

python class python-3.x

8
推荐指数
3
解决办法
8794
查看次数

从Python中的基类导入子类

我有一个基类,它有一个方法,创建一个子类的实例,调用与输入字符串相同.

之前通过将子类和基类放在同一个文件中,并执行类似的操作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)

python import inheritance base subclass

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

Python:以编程方式创建基于__init__值的子类

我有一个基类,我想从中创建许多子类.子类的不同之处仅在于在实例化期间用于调用基类的参数.下面的示例显示了如何创建子类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 dynamic inner-classes

4
推荐指数
1
解决办法
1696
查看次数