小编dir*_*obs的帖子

关于如何在python中使用属性功能的真实示例?

我对如何@property在Python中使用感兴趣.我已经阅读了python文档和那里的例子,在我看来,它只是一个玩具代码:

class C(object):
    def __init__(self):
        self._x = None

    @property
    def x(self):
        """I'm the 'x' property."""
        return self._x

    @x.setter
    def x(self, value):
        self._x = value

    @x.deleter
    def x(self):
        del self._x
Run Code Online (Sandbox Code Playgroud)

我不知道从包装_x填充属性装饰器可以获得什么好处.为什么不实施为:

class C(object):
    def __init__(self):
        self.x = None
Run Code Online (Sandbox Code Playgroud)

我认为,属性功能在某些情况下可能会有用.但当?有人可以给我一些现实世界的例子吗?

谢谢.

python oop properties python-decorators

133
推荐指数
9
解决办法
7万
查看次数

为什么"%.10f"%Decimal(u)会发出带有字面冒号的字符串?

格式化要打印的数字时,正在使用点后面的冒号格式化12位数字.为什么会这样?这是AIX系统上的Python 2.7.

$ uname -a ; /opt/bin/python2.7
AIX myserver 1 6 00F6A5CC4C00
Python 2.7.12 (default, Sep 29 2016, 12:02:17) [C] on aix5
Type "help", "copyright", "credits" or "license" for more information.
>>> '{0:.10f}'.format(123456789012)
'123456789011.:000000000'
>>> from decimal import Decimal
>>> u=123456789012
>>> print "%.10f" % Decimal(u)
123456789011.:000000000
Run Code Online (Sandbox Code Playgroud)

更多的信息:

它不是每12位数字:

>>> for x in range(123456789010,123456789020):
...     print '{0:.10f}'.format(x)
...
12345678900:.0000000000
123456789010.:000000000
123456789011.:000000000
123456789013.0000000000
123456789013.:000000000
123456789015.0000000000
123456789016.0000000000
123456789017.0000000000
123456789017.:000000000
123456789019.0000000000
Run Code Online (Sandbox Code Playgroud)

任何其他长度数字都不会发生这种情况.另外,我尝试了bash和perl的printf,而且这两种情况都没有发生.

这里发生了什么?

根据要求,这是一个截屏视频.

更多要求的信息:

>>> import locale
>>> locale.getdefaultlocale()
('en_US', …
Run Code Online (Sandbox Code Playgroud)

python aix string-formatting

40
推荐指数
1
解决办法
1549
查看次数

致命的Python错误和`BufferedWriter`

我在文件中发现了这一段,其中说:

二进制缓冲对象(的实例BufferedReader,BufferedWriter,BufferedRandomBufferedRWPair)使用锁保护它们的内部结构; 因此,可以安全地从多个线程一次调用它们.

鉴于GIL正在行动,我不确定为什么他们需要"保护"他们的内部结构.谁在乎?在我发现这个锁具有一定意义之前我并不在意,考虑这段代码:

from _thread import start_new_thread
import time

def start():
    for i in range(10):
        print("SPAM SPAM SPAM!")

for i in range(10):
    start_new_thread(start, ())

time.sleep(0.0001)
print("main thread exited")
Run Code Online (Sandbox Code Playgroud)

在Python 3.X上运行时的输出:

...many SPAM...
SPAM SPAM SPAM!
SPAM SPAM SPAM!
SPAM SPAM SPAM!
main thread exited
SPAM SPAM SPAM!
SPAM SPAM SPAM!
SPAM SPAM SPAM!
SPAM SPAM SPAM!
SPAM SPAM SPAM!
Fatal Python error: could not acquire lock for 
<_io.BufferedWritername='<stdout>'> at interpreter shutdown, …
Run Code Online (Sandbox Code Playgroud)

python linux multithreading python-2.7 python-internals

24
推荐指数
2
解决办法
3993
查看次数

Windows上的最大进程ID是多少?

通过调用DWORD GetProcessId(HANDLE)或可以获得的最大进程ID是DWORD GetCurrentProcessId()多少?它没有记录在API的文档页面上.

windows winapi pid process

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

什么是稀疏文件,为什么需要它?

什么是稀疏文件,为什么需要它?我唯一能得到的是它是一个非常大的文件,它是高效的(千兆字节).效率如何?

filesystems system file disk sparse-file

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

如果python解释器没有打开终端/控制台窗口,那么标准流是什么?

在Ubuntu Desktop(Unity)下,当一个脚本标记为可执行文件然后我点击该文件时,我会弹出一个窗口,如图中的那个:

在此输入图像描述

pyscript.py是一个带有shebang的可执行Python脚本文件:#!/usr/bin/python其中/ usr/bin/python是Python解释器的路径.由于我没有在终端窗口中运行此过程,因为我只是单击"运行",我认为最初没有标准流进程; 当我进行更多实验时,我意识到所有标准流都可用:

pyscript.py

#!/usr/bin/python3
import sys, os
f = file=open("output.txt", "w")
print(sys.stdout, sys.stdin, sys.stderr, sep='\n', file=f)
Run Code Online (Sandbox Code Playgroud)

output.txt的

<_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'>
<_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'>
<_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>
Run Code Online (Sandbox Code Playgroud)

提出问题,后台没有运行终端窗口,sys.stdout,stdin和stderr连接到什么?从技术上讲,使用.pyw在Windows下运行没有控制台窗口的Python 我得到相同的输出.

看看这个问题:pythonw.exe或python.exe?

一个答案说明如下:

标准流 sys.stdin,sys.stdout并且sys.stderr不可用.

当我通过单击.pyw文件在Windows 10中使用Python 2.7测试时,标准流不可用的重点似乎不是真的,但是,在Windows注册表中.pyw文件与运行的Python 2.X相关联我机器上的pythonw.exe.

这个问题是Unix/Windows的混乱!

python unix linux windows terminal

10
推荐指数
1
解决办法
262
查看次数

内存中None的值是多少?

None在Python中是一个保留字,只是一个关于None内存中确切值的问题.我脑子里想的是这个,None在内存中的表示是0或指向堆的指针.但是指向内存中空区域的指针都不会使零值有意义.因为我测试了以下内容:

>>> None.__sizeof__()
16
Run Code Online (Sandbox Code Playgroud)

事实证明,None消耗16个字节,实际上只是一个空值.

那么None内存中实际代表什么呢?

python

9
推荐指数
2
解决办法
2327
查看次数

返回OSError异常类子类实例的逻辑在哪里?

我一直在寻找一些对某些人来说相对愚蠢的东西,但对我来说非常有趣!:-)

输入和输出错误已OSError在Python 3.3中合并,因此异常类层次结构发生了变化.关于内建类的一个有趣的特点OSError是,它通过时返回它的一个子类errnostrerror

>>> OSError(2, os.strerror(2))
FileNotFoundError(2, 'No such file or directory')

>>> OSError(2, os.strerror(2)).errno
2
>>> OSError(2, os.strerror(2)).strerror
'No such file or directory'
Run Code Online (Sandbox Code Playgroud)

正如你可以看到传递errno和返回实例strerror的构造函数,它是一个子类.OSErrorFileNotFoundErrorOSError

Python Doc:

构造函数实际上经常返回OSError的子类,如下面的OS 异常中所述.特定的子类取决于最终的errno值.此行为仅在直接构造OSError或通过别名构造时发生,并且在子类化时不会继承.

我想编写一个以这种方式运行的子类.这主要是好奇心,而不是现实世界的代码.我也试图知道,创建子类对象的逻辑在哪里__new__,例如它编码?如果__new__包含用于创建子类实例的逻辑,则继承OSError通常会返回此行为,除非存在某种类型的检查__new__:

>>> class A(OSError): pass 
>>> A(2, os.strerror(2))
A(2, 'No such file or directory')
Run Code Online (Sandbox Code Playgroud)

必须进行类型检查:

# If passed OSError, returns subclass instance
>>> A.__new__(OSError, 2, os.strerror(2))         
FileNotFoundError(2, …
Run Code Online (Sandbox Code Playgroud)

python

9
推荐指数
2
解决办法
304
查看次数

从对象类型.__ setattr__有多么不同.__ setattr__?

type.__setattr__用于类,基本上是元类的实例. object.__setattr__另一方面,用于类的实例.这完全可以理解.

我没有看到这两种方法之间存在显着差异,至少在Python级别,我注意到两者使用相同的属性赋值程序,如果我错了,请纠正我:

假设a是一个用户定义的类的实例,只是一个普通的类:

class A:
    pass

a = A()
a.x = ...
Run Code Online (Sandbox Code Playgroud)

然后a.x = ..调用type(a).__setattr__(...)执行以下步骤:

注意:type(a).__setattr____setattr__object内置类中找到

1)在中寻找数据描述符type(a).__mro__.

2)如果找到数据描述符,则调用其__set__方法并退出.

3)如果没有找到数据描述符type(a).__mro__,则添加属性a.__dict__,a.__dict__['x'] = ...


使用类 - 元类的实例,过程类似:

class A(metaclass=type):
    pass
Run Code Online (Sandbox Code Playgroud)

then:A.x = ...被翻译为type(A).__setattr__(...)执行以下步骤:

注意:type(A).__setattr____setattr__type内置类中找到

1)在中寻找数据描述符 type(A).__mro__

2)如果找到数据描述符,则调用其__set__方法并退出.

3)如果没有找到数据描述符type(A).__mro__,则添加属性A.__dict__,a.__dict__['x'] = ...

object.__setattr__ …

python metaclass

9
推荐指数
1
解决办法
747
查看次数

class属性查找规则?

>>> class D:
...     __class__ = 1
...     __name__ = 2
...
>>> D.__class__
<class 'type'>
>>> D().__class__
1
>>> D.__name__
'D'
>>> D().__name__
2
Run Code Online (Sandbox Code Playgroud)

为什么D.__class__返回类的名称,同时D().__class__返回D类中定义的属性?

而从哪里内置的属性,如__class____name__从何而来?

我怀疑__name__或是__class__简单的描述符,无论是在object课堂上还是在某个地方,但这是无法看到的.

根据我的理解,Python中的属性查找规则如下,省略描述符的条件等.:

Instance --> Class --> Class.__bases__ and the bases of the other classes as well

鉴于一类是元类的实例,type在这种情况下,为什么D.__class__不找__class__D.__dict__

python python-internals

6
推荐指数
1
解决办法
949
查看次数