我一直在尝试理解python元类,所以一直在尝试一些示例代码.据我所知,Python元类可以是任何可调用的.所以,我可以让我的元类像
def metacls(clsName, bases, atts):
....
return type(clsName, bases, atts)
Run Code Online (Sandbox Code Playgroud)
但是,我看到很多人用以下方式编写他们的元类:
class Metacls(type):
def __new__(meta, clsName, bases, atts):
....
return type.__new__(meta, clsName, bases, atts)
Run Code Online (Sandbox Code Playgroud)
据我所知,这些都会做同样的事情.是否有任何理由使用基类?这是习惯吗?
我set在交互式python会话中使用它作为变量名称而意外地覆盖了 - 有没有什么办法可以在set不重新启动会话的情况下访问原始函数?
(我在那个会话中有很多东西,我宁愿不必这样做,虽然我当然可以在必要的时候.)
偶尔我会遇到一个非常难以调试的问题:在我的$ PYTHONPATH中有一个剩余的.pyc文件,并且匹配的.py文件已被移动到稍后在$ PYTHONPATH的其他地方 - 所以当我尝试要导入模块,使用"孤立".pyc文件,并且忽略对"真实".py文件的所有更改,让我感到非常困惑,直到我发现正在发生的事情.
有没有办法使python 不使用"孤立".pyc文件,或在使用它们时打印警告?
或者,我有这个问题的事实是否意味着我做错了什么,如果是的话,那是什么?
而不是这个:
FILE = open(f)
do_something(FILE)
FILE.close()
Run Code Online (Sandbox Code Playgroud)
最好使用它:
with open(f) as FILE:
do_something(FILE)
Run Code Online (Sandbox Code Playgroud)
如果我有这样的东西怎么办?
if f is not None:
FILE = open(f)
else:
FILE = None
do_something(FILE)
if FILE is not None:
FILE.close()
Run Code Online (Sandbox Code Playgroud)
当do_something也有一个"如果文件是无"的条款,而且还做一些有用的事情在这种情况下-我不希望只是跳过do_something如果FILE是无.
是否有一种合理的方式将其转换为/作为形式?或者我只是想以错误的方式解决可选文件问题?
Python具有元类的概念,如果我理解正确,允许您在构造时修改类的对象.您没有修改类,而是修改了要创建的对象然后进行初始化.
Python(至少从3.0开始,我相信)也有类装饰器的想法.如果我理解正确的话,类装饰器允许在声明它时修改类定义.
现在我相信Ruby中的类装饰器有一个相同的特性或功能,但我目前还没有意识到类似于元类的东西.我确信你可以通过一些函数轻松地抽取任何Ruby对象并按照你的意愿去做,但是语言中是否有一个像metaclass那样设置的功能?
那么,Ruby是否有类似于Python的元类的东西?
编辑我关于Python的元类.元类和类装饰器做的事情非常类似.它们都在定义时以不同的方式修改类.希望Python大师能够在Python中更好地解释这些功能.
但是类或类的父类可以实现一个__new__(cls[,..])函数,该函数在初始化之前自定义对象的构造__init__(self[,..]).
编辑此问题主要用于讨论和了解两种语言在这些功能中的比较.我熟悉Python但不熟悉Ruby并且很好奇.希望其他对这两种语言有相同问题的人会发现这篇文章很有帮助,也很有启发性.
在scala我需要实现类似于python元类的东西.在我的例子中,使用元类的目的通常是创建一个特定基类的所有子类的注册表 - 也就是说,从类的字符串表示到类的引用的映射.在python中,将元类放在基类上是非常方便的,这样就不需要在每个子类上做任何特殊操作.我想在scala中做类似的事情.有没有办法模仿元类,或以其他方式做到这一点?谢谢!
我已经研究了几个小时无济于事.
当我安装python 3时,我想在/ usr/bin/python中删除了我的目录,因为我收到此错误: -bash: /usr/bin/python: No such file or directory.
我试过了sudo ln -s /usr/bin/python2.7 /usr/bin/python,这给了我ln: /usr/bin/python: File exists
但是,它仍然不会在/ usr/bin/python中永久安装目录.如何永久还原此目录?
我在Mac上.
谢谢!
我需要将两个html文件的主体连接成一个html文件,其间有一些任意html作为分隔符.我有代码曾经为此工作,但当我从Xubuntu 11.10(或11.04?)升级到12.10时停止工作,可能是由于BeautifulSoup更新(我目前正在使用3.2.1;我不知道我之前有什么版本)或vim更新(我使用vim从纯文本中自动生成html文件).这是代码的精简版:
from BeautifulSoup import BeautifulSoup
soup_original_1 = BeautifulSoup(''.join(open('test1.html')))
soup_original_2 = BeautifulSoup(''.join(open('test2.html')))
contents_1 = soup_original_1.body.renderContents()
contents_2 = soup_original_2.body.renderContents()
contents_both = contents_1 + "\n<b>SEPARATOR\n</b>" + contents_2
soup_new = BeautifulSoup(''.join(open('test1.html')))
while len(soup_new.body.contents):
soup_new.body.contents[0].extract()
soup_new.body.insert(0, contents_both)
Run Code Online (Sandbox Code Playgroud)
用于测试用例的两个输入文件的主体非常简单:contents_1是\n<pre>\nFile 1\n</pre>\n'和contents_2是'\n<pre>\nFile 2\n</pre>\n'.
我希望soup_new.body.renderContents()将这两者与这两者之间的分隔符串联起来,而不是将所有的<变为<等等 - 所需的结果是'\n<pre>\nFile 1\n</pre>\n\n<b>SEPARATOR\n</b>\n<pre>\nFile 2\n</pre>\n',这是我在操作系统更新之前得到的结果; 目前的结果是'\n<pre>\nFile 1\n</pre>\n\n<b>SEPARATOR\n</b>\n<pre>\nFile 2\n</pre>\n',这是非常没用的.
将html作为字符串插入汤对象的体内时,如何使BeautifulSoup停止<转入<等?或者我应该以完全不同的方式做这件事?(这是我对BeautifulSoup和大多数其他html解析的唯一体验,所以我猜这可能就是这种情况.)
html文件是用vim的纯文本文件自动生成的(我使用的真实案例显然更复杂,并且涉及自定义语法高亮,这就是为什么我这样做的原因).完整的test1.html文件如下所示,test2.html除内容和标题外完全相同.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html> …Run Code Online (Sandbox Code Playgroud) 我刚刚开始在 python 中使用 bitarray 包,并尝试从整数创建 bitarray 给了我非常令人困惑的结果:
>>> import bitarray
>>> bitarray.bitarray(5)
bitarray('01000')
>>> bitarray.bitarray(5)
bitarray('00010')
>>> bitarray.bitarray(5)
bitarray('00100')
>>> bitarray.bitarray(5)
bitarray('00110')
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么会发生这种情况?
另外:从 int 生成位数组的更好方法是什么?这是可行的,但是字符串转换似乎是一种奇怪的方法......
>>> bitarray.bitarray(bin(5)[2:])
bitarray('101')
Run Code Online (Sandbox Code Playgroud)
编辑:我最终切换到bitstring,它确实有一个从整数获取位串的简单方法:
>>> bitstring.BitArray(uint=5,length=6)
BitArray('0b000101')
Run Code Online (Sandbox Code Playgroud) 我想知道的是,对象是否会从一个类引用来创建一个特定的类或任何其后代的一个实例.
换句话说,我想要一个布尔表达式,如
var is TMyClass
Run Code Online (Sandbox Code Playgroud)
但是var被替换为涉及类引用变量的表达式.这听起来很容易,但让我完全难过.
我可以创建一个实例var:= classRefVar.Create,测试它,然后销毁它,但这是一个巨大的开销.
奇怪的是,编译器不会让我拥有
classRefVar(nil) is TMyClass
Run Code Online (Sandbox Code Playgroud)
但对于看似等效的语法却很无用,却很无用
TMyClass(nil) is TMyClass
Run Code Online (Sandbox Code Playgroud)
显然,表达
classRefVar = TMyClass
Run Code Online (Sandbox Code Playgroud)
并不好,因为classRefVar可能引用了TMyClass的后代.
当我看到答案时,我期待着自己踢...
我在D:\ python27上安装了Python。现在我想知道如何制作它,这样我就不必键入
D:\python27\python.exe myscript.py
Run Code Online (Sandbox Code Playgroud)
但是,只需使用
python myscript.py
Run Code Online (Sandbox Code Playgroud)
我知道安装后应该已经配置好了,但是以某种方式,我使用的笔记本电脑没有注册python快捷方式。那么如何手动设置呢?