相关疑难解决方法(0)

有一个类跟踪它的实例是Pythonic吗?

请使用以下代码段

class Missile:
    instances = []

    def __init__(self):
        Missile.instances.append(self)
Run Code Online (Sandbox Code Playgroud)

现在拿代码:

class Hero():
    ...
    def fire(self):
        Missile()
Run Code Online (Sandbox Code Playgroud)

当英雄射击时,需要创建导弹并将其附加到主列表中.因此,当激活时,英雄对象需要引用该列表.以下是一些解决方案,但我确信还有其他解决方案:

  • 使列表成为全局列表,
  • 使用类变量(如上所述)或
  • 让hero对象持有对列表的引用.

我没有在gamedev上发布这个,因为我的问题实际上更为一般:以前的代码是否可以考虑?鉴于这种情况,是否有更多的Pythonic解决方案?

python pygame

3
推荐指数
1
解决办法
264
查看次数

在python中使用类型类创建一个类型类

我正在阅读关于元类的这篇有趣的帖子什么是Python中的元类?.接受的答案显示了如何使用具有以下签名的类型创建类.

type(类的名称,父类的元组(用于继承,可以为空),包含属性名称和值的字典)

我尝试使用上面的签名创建"类型"类,我很惊讶我被允许创建一个首先!您的意见表示赞赏!

type = type('type',(),{});

其次,在使用上述语法创建类型类之后,我无法做到

myclass = type('myclass',(),{}); 
Run Code Online (Sandbox Code Playgroud)

type = type('type',(),{});

我说错了

Traceback(最近一次调用last):TypeError中的文件"",第1行:object.new()不带参数

但是,当我尝试以下内容时,我可以成功.

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

我很困惑,根据我的理解,上面的代码片段应该调用类型来尝试创建类'myclass'.发生什么了!?我错过了一些细节吗?

python metaclass

3
推荐指数
1
解决办法
3168
查看次数

在构造类对象后执行代码

我希望通过让每个子类在父类保存的列表中注册自己来创建给定类的所有子类的列表,即类似这样的事情:

class Monster(object):
    monsters = list()
class Lochness(Monster):
    Monster.monsters.append(Lochness)
class Yeti(Monster):
    Monster.monsters.append(Yeti)
Run Code Online (Sandbox Code Playgroud)

这显然不起作用,因为当我想将它们添加到列表中时尚未创建类.而且,如果它是自动完成的话会更好(比如__subclass__)

我知道__subclass__有这个功能,但我想知道(我自己的启发)你自己如何实现它.

看起来你想创建一些类元类的子类,它创建了一些用Monster注册它的东西?或者完全偏离基础

python

3
推荐指数
1
解决办法
250
查看次数

我如何子类threading.Event?

在Python 2.7.5中:

from threading import Event

class State(Event):
    def __init__(self, name):
        super(Event, self).__init__()
        self.name = name

    def __repr__(self):
        return self.name + ' / ' + self.is_set()
Run Code Online (Sandbox Code Playgroud)

我明白了:

TypeError:调用元类base
函数时出错()参数1必须是代码,而不是str

为什么?

我所知道的关于线程的一切.事件我从以下网站学习:http://docs.python.org/2/library/threading.html?highlight = threading # event-objects

当它说threading.Event()是类threading.Event ???的工厂函数时它是什么意思?(呃......看起来对我很平常).

python factory metaclass subclass

3
推荐指数
1
解决办法
768
查看次数

`type`真的是一个功能,还是没有?

首先,如果我问一些愚蠢的话,我很抱歉,因为我是Python的新手...
我正在阅读http://docs.python.org/3.1/reference/datamodel.html#objects-values-and -types并看到那句话:

type()函数返回一个对象的类型(它本身就是一个对象)

当然,我决定检查一下:

>>> def someFunction(x):
...     return x * x
...     
>>> type(someFunction)
<class 'function'>
>>> type(type)
<class 'type'>
Run Code Online (Sandbox Code Playgroud)

所以,看起来函数有function类型,但是type如果它是一个函数,为什么函数有不同的类型?或者说文档是撒谎,它不是真正的功能?

python types function object python-3.x

3
推荐指数
1
解决办法
108
查看次数

使用namedtuple的_replace方法更新包含nt的其他数据结构的字段

我正在学习namedtuple.我想找到一种方法,使用该._replace方法,更新namedtuple它们所在的所有外观.

假设我有一个节点列表,以及这些节点定义的元素列表(双节点波束,四节点四边形)和边界("一个节点"元素).

我正在玩这个:

from collections import namedtuple as nt
Node = nt('Node', 'x y')
Beam = nt('Beam', 'i j')
Quad = nt('Quad', 'i j k l')
Boundary = nt('Boundary', 'b')
#Define some nodes:
n1 = Node(0,0)
n2 = Node(0,1)
n3 = Node(1,1)
n4 = Node(1,0)
#And some other things using those nodes:
q1 = Quad(n1,n2,n3,n4)
b1 = Boundary(n1)
be1 = Beam(n1,n4)
Run Code Online (Sandbox Code Playgroud)

现在,如果我换成n1新的Node:

n1 = n1._replace(x=0.5,y=0.5)
print(n1)  # Node(x=0.5,y=0.5)
Run Code Online (Sandbox Code Playgroud)

其他所有项目均未更新:

print(b1)  # Boundary(b=Node(x=0, …
Run Code Online (Sandbox Code Playgroud)

python

3
推荐指数
1
解决办法
1570
查看次数

在 Python 中子类化时附加到成员列表

说我有这门课:

class FooClass(object):
    foos = ["foo", "bar"]

    def do_foos(self):
        for foo in self.foos:
            print("I have a " + foo)

    # ...
Run Code Online (Sandbox Code Playgroud)

我想为这个扩展的类创建一个 SpecialisedFooClass FooClass,将一个项目添加"spec"foos(即foos包含["foo", "bar", "spec"])。

SpecialisedFooClass.foos应该取决于FooClass.foos:如果我更改FooClass'定义以便foos包含["foo", "bam", "bat"],则SpecialisedFooClass.foos应该包含["foo", "bam", "bat", "spec"]


这是迄今为止我想出的最好的方法:

class SpecialisedFooClass(FooClass):
    foos = FooClass.foos + ["spec"]
Run Code Online (Sandbox Code Playgroud)

但我发现明确提到了FooClass有关。当我决定添加一个中间子类时(即当SpecialisedFooClass' 超类更改时),我将不可避免地忘记更新此引用。事实上,我已经在 IRL 使用我正在处理的代码库中犯了这个错误(实际上并没有处理 foos、bams 和 bats...)。


在我的情况下实际上没有特殊要求foos是类成员而不是实例成员,所以这也可以,但我觉得它很难看。此外,该super调用仍然有一个显式的类引用 …

python oop inheritance

3
推荐指数
1
解决办法
1139
查看次数

Python AttributeError:类型对象'x'没有属性'x'

我目前正在研究一个简单的基于文本的Python游戏,只是为了练习python和面向对象的编程,但我遇到了这个错误,它告诉我'LargeManaPotion'没有属性'name',当我看到它确实如此,它的声明方式与'SmallManaPotion'完全相同.我假设这是一个愚蠢的错误,我只是在俯视或者什么但是会很感激帮助.此外,当我在player.inventory函数中打印播放器的库存时,程序将打印药水,所以我不确定为什么它在交易功能中不起作用.无论如何,这是相关的代码.提前致谢.

class ManaPotion:
    def __init__(self):
        raise NotImplementedError("Do not create raw ManaPotion objects.")

    def __str__(self):
        return "{} (+{} Mana)".format(self.name, self.mana_value)


class LargeManaPotion(ManaPotion):
    def __init__(self):
        self.name = "Large Mana Potion"
        self.mana_value = 45
        self.value = 40


class SmallManaPotion(ManaPotion):
    def __init__(self):
        self.name = "Small Mana Potion"
        self.mana_value = 15
        self.value = 10
Run Code Online (Sandbox Code Playgroud)

如您所见,它与SmallManaPotion相同.这是导致错误的函数.

class TraderTile(MapTile):
def intro_text(self):
    return "A frail not-quite-human, not-quite-creature squats in the corner " \
           "\nclinking his gold coins together. \nHe looks willing to trade."

def __init__(self, x, y):
    self.trader …
Run Code Online (Sandbox Code Playgroud)

python debugging

3
推荐指数
1
解决办法
1552
查看次数

如何在Python自己的类中保存类的实例作为Python中的类变量?

我正在尝试定义一个具有自身实例作为类变量的类,因此我可以在整个地方引用它的公共实例.

我怎样才能得到这样的东西?

class Point():
  ORIGIN = Point()

  def __init__(self, x=0, y=0):
    self.x = x
    self.y = y

p0 = Point.ORIGIN
p1 = Point(3,4)

distance = (p1.x*p1.x + p1.y*p1.y) ** .5
print(distance)
Run Code Online (Sandbox Code Playgroud)

python python-3.x

3
推荐指数
1
解决办法
63
查看次数

Python .__class__.__name__ 适用于一个类,但不适用于另一个类

如果我被认为非常愚蠢,我很抱歉,我对 python 比较陌生,我不知道我在这里做错了什么。

我有两个班级,我尝试使用以下命令获取两个班级的班级名称

*class*.__class__.__name__
Run Code Online (Sandbox Code Playgroud)

现在,正如我所说,这适用于一个类,但不适用于另一个类。

这些是我的课程:

class fb():
    val = 300
    mult = 2.0
    shsym = pygame.image.load('img/dummy2.png')
    value = 50
class a():
    occ = 0
    shsym = pygame.image.load('img/it/a/shsym.png')
    plsym = pygame.image.load('img/it/a/plsym.png')
    value = 100
    hesyms = [pygame.image.load('img/a/hesym0',pygame.image.load('img/dummy.png'))]
    coord = [(50, 300),(30, 435),(310, 350)]
Run Code Online (Sandbox Code Playgroud)

里面的变量可能并不重要,但由于我无法找出问题所在,所以我只包含了整个内容。

然后我定义它们

fob = fb()
ita = a()
Run Code Online (Sandbox Code Playgroud)

然后我将变量设置为定义的类之一

itemselect = fob
Run Code Online (Sandbox Code Playgroud)

最后,我尝试检查类的名称并查看它是否以“f”开头(看看它是否是一组项目的一部分)

if not itemselect.__class__.__name__.startswith("f"):
Run Code Online (Sandbox Code Playgroud)

在那一行我收到错误消息

Traceback (most recent call last):
  File "D:\Programmieren\Cola Atsume\main.py", line 283, in <module>
     if not itemselect.__class__.__name__.startswith("f"):
AttributeError: class fa has …
Run Code Online (Sandbox Code Playgroud)

python class attributeerror

3
推荐指数
1
解决办法
5579
查看次数