小编Sil*_*Ray的帖子

Python:Object不支持索引

是的,之前已经问过这个问题.不,我读过的答案都没有解决我的问题.

我正在尝试制作一个小弹跳游戏.我创建了这样的砖块:

def __init__(self,canvas):
    self.canvas = canvas
    self.brick1 = canvas.create_rectangle(0,0,50,20,fill=random_fill_colour(),outline=random_fill_colour())
    self.brick2 = canvas.create_rectangle(50,0,100,20,fill=random_fill_colour(),outline=random_fill_colour())
    self.brick3 = canvas.create_rectangle(100,0,150,20,fill=random_fill_colour(),outline=random_fill_colour())
    self.brick4 = canvas.create_rectangle(150,0,200,20,fill=random_fill_colour(),outline=random_fill_colour())
    self.brick5 = canvas.create_rectangle(200,0,250,20,fill=random_fill_colour(),outline=random_fill_colour())
    self.brick6 = canvas.create_rectangle(250,0,300,20,fill=random_fill_colour(),outline=random_fill_colour())
    self.brick7 = canvas.create_rectangle(300,0,350,20,fill=random_fill_colour(),outline=random_fill_colour())
    self.brick8 = canvas.create_rectangle(350,0,400,20,fill=random_fill_colour(),outline=random_fill_colour())
    self.brick9 = canvas.create_rectangle(400,0,450,20,fill=random_fill_colour(),outline=random_fill_colour())
    self.brick10 = canvas.create_rectangle(450,0,500,20,fill=random_fill_colour(),outline=random_fill_colour())
    self.bricksId = [self.brick1,self.brick2,self.brick3,self.brick4,self.brick5,self.brick6,self.brick7,self.brick8,self.brick9,self.brick10]
Run Code Online (Sandbox Code Playgroud)

而我正在尝试引用bricksId[0]此处的ID :

self.hit_brick(pos,self.bricks.bricksId[0])
Run Code Online (Sandbox Code Playgroud)

之前,在中__init__,我将砖块定义为砖块,定义为Brick(canvas).但是,错误指出:

TypeError: 'Brick' object does not support indexing
Run Code Online (Sandbox Code Playgroud)

在对该主题的其他问题的答案中,我找不到任何帮助我访问的内容bricks.bricksId[0].

python indexing object typeerror

18
推荐指数
1
解决办法
7万
查看次数

在Windows上easy_install cx_Oracle(python包)

所以我发现帮助安装cx_Oracle但仍然卡住了.我从oracle下载了最新的instantclient,并将ORACLE_HOME设置为解压缩文件的位置(直接和ORACLE_HOME值与文件之间的bin文件夹),但easy_install在运行setup.py时弹出错误说它可以'找到Oracle包含文件.我注意到文件夹中只有11g dll,我是否需要所有3个驱动程序才能完成设置?如果是这样,我在哪里获得它们?

python windows cx-oracle easy-install

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

在__new__中进行初始化工作是"原罪"吗?如果是这样,那么如何最好地处理单例初始化运行?

我有一个类,我使用标准的python单例形式.它也只是一个值,但不是在每个实例中初始化它,我在__new__()执行单例处理时启动它.这是pythonic方式吗?如果没有,我还能怎么做?

class Foo(object):
    _inst = None
    def __new__(cls, val):
        if Foo._inst is None:
            Foo._inst = super(Foo, self).__new__(cls)
            Foo._inst.val = val
        return Foo._inst
Run Code Online (Sandbox Code Playgroud)

这显然是简化形式.我已经使用了等待直到__init__()检查的结构并设置Foo._inst为一个单独的初始化处理运行,但在多线程情况下这似乎已经成熟同步错误.对于在现有实例中没有可能被损坏的值的情况如果__init__()再次运行,将init放入其中是没有害处的__init__(),除了你运行的代码在你不需要的时候实际上什么都不做,但是那里通常是腐败的状态值,我不想覆盖.我知道单身人士也是邪恶的,但有时候,他们是最好的解决方案(比如定义我希望能够检查的特殊用途类型is).

这似乎是我能想到的最好的解决方案,但我觉得初始化实例值很脏__new__().有没有人有关于如何更好地处理这个问题的想法?

python

5
推荐指数
1
解决办法
223
查看次数

动态地将可调用的类添加为类的“方法”

我实现了一个元类,该元类拆解使用它创建的类的类属性,并根据这些参数中的数据构建方法,然后将这些动态创建的方法直接附加到类对象上(所涉及的类可轻松定义Web表单对象,在网络测试框架中使用)。它一直工作得很好,但是现在我需要添加一个更复杂的方法类型,为了保持环境整洁,我将其实现为可调用类。不幸的是,当我尝试在实例上调用可调用类时,将其视为类属性而不是实例方法,并且在调用时仅接收其自己的self。我知道为什么会发生这种情况,但我希望有人能提供比我提出的解决方案更好的解决方案。问题的简化图示:

class Foo(object):
    def __init__(self, name, val):
        self.name = name
        self.val = val
        self.__name__ = name + '_foo'
        self.name = name
    # This doesn't work as I'd wish
    def __call__(self, instance):
        return self.name + str(self.val + instance.val)

def get_methods(name, foo_val):
    foo = Foo(name, foo_val)
    def bar(self):
        return name + str(self.val + 2)
    bar.__name__ = name + '_bar'
    return foo, bar

class Baz(object):
    def __init__(self, val):
        self.val = val

for method in get_methods('biff', 1):
    setattr(Baz, method.__name__, method)
baz = …
Run Code Online (Sandbox Code Playgroud)

python methods class callable

5
推荐指数
1
解决办法
1301
查看次数

SQLAlchemy 双向关联代理

我正在尝试使用映射表创建一个简单的多对多关系,其中包含有关它使用 SQLAlchemy 两端的关联代理表示的关系的元数据。但是,我似乎无法让它发挥作用。这是我一直在尝试弄清楚的玩具示例:

Base = declarative_base()


def bar_creator(bar):

    _ = FooBar(bar=bar)
    return bar


class Foo(Base):

    __tablename__ = 'foo'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    bars = association_proxy('bar_associations', 'bar',
                             creator=bar_creator)


def foo_creator(foo):

    _ = FooBar(foo=foo)
    return foo


class Bar(Base):

    __tablename__ = 'bar'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    foos = association_proxy('foo_associations', 'foo',
                             creator=foo_creator)


class FooBar(Base):

    __tablename__ = 'fooBar'

    foo_id = Column(Integer, ForeignKey('foo.id'), primary_key=True)
    bar_id = Column(Integer, ForeignKey('bar.id'), primary_key=True)
    bazed = Column(Boolean)
    foo = relationship(Foo, backref='bar_associations')
    bar = relationship(Bar, backref='foo_associations') …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy associations relationship

5
推荐指数
1
解决办法
1814
查看次数

子类中重写属性setter的特性

所以我有这个:

class Parent(object):

    def __init__(self, val):
        print 'enter Base init'
        self._set_x(val)
        print 'leave Base init'

    def _get_x(self):
        return self._x

    def _set_x(self, val):
        print 'enter Base _set_x'
        self._x = val
        print 'leave Base _set_x'

    x = property(_get_x, _set_x)

class Child(Parent):

    def _set_x(self, val):
        print 'enter Child _set_x'
        y = val * 2
        super(Child, self)._set_x(y)
        print 'leave Child _set_x'

child = Child(5)
num = child.x
child.x = 5
print num == child.x
Run Code Online (Sandbox Code Playgroud)

当我运行它时,我得到了这个:

enter Base init
enter Child _set_x
enter Base _set_x …
Run Code Online (Sandbox Code Playgroud)

python overriding properties

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