小编xyg*_*guo的帖子

Python:如何使用最少的代码行扩展一个庞大的类?

原始问题描述

当我实现一些机器学习算法时出现问题numpy.我想要一些新的类ludmo,它的工作方式相同 numpy.ndarray,但有一些属性.例如,使用新属性ludmo.foo.我已经尝试过以下几种方法,但没有一种方法令人满意.

1.包装

首先,我创建了一个包装类numpy.ndarray,如

import numpy as np

class ludmo(object):
    def __init__(self)
        self.foo = None
        self.data = np.array([])
Run Code Online (Sandbox Code Playgroud)

但是当我使用一些函数(scikit-learn我无法修改)来操作np.ndarray实例列表时,我必须先提取data每个ludmo对象的所有字段并将它们收集到一个列表中.之后,列表被排序,我丢失了data原始ludmo对象之间的对应关系.

2.继承

然后我试着创建ludmo一个子类numpy.ndarray,as

import numpy as np

class ludmo(np.ndarray):
    def __init__(self, shape, dtype=float, buffer=None, offset=0, strides=None, order=None)
        super().__init__(shape, dtype, buffer, offset, strides, order)
        self.foo = None
Run Code Online (Sandbox Code Playgroud)

但是另一个问题出现了:创建numpy.ndarray对象的最常见方法是numpy.array(some_list)返回一个numpy.ndarray对象,我必须将它转换为一个ludmo对象.但到目前为止,我发现没有好办法做到这一点; …

python arrays inheritance numpy class

8
推荐指数
1
解决办法
423
查看次数

加载elpa和init.el的顺序

我从https://github.com/technomancy/emacs-starter-kit中取出了入门套件,它已经安装在~/.emacs.d/elpa.按照说明starter-kit.el,我将用户特定的自定义放入~/.emacs.d/$USER.el:

(require 'color-theme-solarized)
(color-theme-solarized-dark)
(require 'auto-complete)
(global-auto-complete-mode)
Run Code Online (Sandbox Code Playgroud)

但是,当我开始使用emacs时,它说

File error: Cannot open load file, color-theme-solarized
Run Code Online (Sandbox Code Playgroud)

我检查了load-path变量,发现路径color-theme-solarized不在其中.所以我在"要求"它之前添加它:

 (add-to-list 'load-path "~/.emacs.d/elpa/color-theme-solarized-20120301)
Run Code Online (Sandbox Code Playgroud)

然而,错误仍然存​​在.然后我提到了elpa的wiki,它说所有的包都在init.el加载后初始化.然后我读starter-kit.el,发现$USER.el被添加到after-init-hook,这意味着由于不应该发生的错误$USER.el是在初始化的端部加载.我拼命地将我的所有定制移到最后init.el,令我惊讶的是,它工作正常.它似乎init.el是最后加载而不是最初加载.我怎么能让我的自定义工作除了写在init.el?我不想做init.el太长时间.

PS:我已经把(require 'package)(package-initialize)之初init.el ,并没有发挥作用.

emacs24

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

命令 `python setup.py build_ext --inplace` 总是创建一个新目录

假设我有一个如下结构的 python 包:

foo/
  __init__.py
  setup.py
  bar/
    __init__.py
    bar.pyx
Run Code Online (Sandbox Code Playgroud)

的内容setup.py

from distutils.core import setup
from Cython.Build import cythonize
import numpy as np

setup(
    ext_modules=cythonize("bar/bar.pyx"),
    include_dirs=[np.get_include()]
)
Run Code Online (Sandbox Code Playgroud)

然后我就跑

python setup.py build_ext --inplace
Run Code Online (Sandbox Code Playgroud)

因为我需要将编译后的文件bar.so准确放置在bar/. 但是前面的命令foo/bar/在 下创建了一个新目录bar,并放在bar.so那里,比如说,

foo/
  __init__.py
  setup.py
  bar/
    __init__.py
    bar.pyx
    foo/
      bar/
        bar.so
Run Code Online (Sandbox Code Playgroud)

而我需要的是

foo/
  __init__.py
  setup.py
  bar/
    __init__.py
    bar.pyx
    bar.so
Run Code Online (Sandbox Code Playgroud)

这些烦人的事情发生在我转身foo成为bar一个包裹之后。如果我删除foo/__init__.py然后会出现在,仍然不会bar/__init__.py。我已阅读手册,但没有找到解决此问题的选项。bar.sofoo/foo/bar/

那么如果我要求bar.so出现在正确的位置,同时保留这两个__init__.py文件该怎么办呢?

python cython setup.py python-2.7

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

标签 统计

python ×2

arrays ×1

class ×1

cython ×1

emacs24 ×1

inheritance ×1

numpy ×1

python-2.7 ×1

setup.py ×1