ããã«ã¡ã¯ãäœæ°ïŒ Pythonã¯ãããŸããŸãªåéã§äœ¿çšãããåçããã°ã©ãã³ã°èšèªã§ãã Pythonã§ã³ãŒããæžãã®ã¯ç°¡åã§ãããã³ãŒããèªã¿ããããåå©çšå¯èœã§ãä¿å®ãããããã®ã«ããã®ã¯ã¯ããã«å°é£ã§ãã Pythonã®ç¬¬3çã ããã¹ããã©ã¯ãã£ã¹ãšããŒã«ãã¯ããœãããŠã§ã¢ã®éçºãšä¿å®ã®åé¡ã广çã«è§£æ±ºããããã®ããŒã«ãæäŸããŸããèè
ã¯ãPython3.7ã®æ°æ©èœãšPythonæ§æã®é«åºŠãªåŽé¢ã«ã€ããŠèª¬æããããšããå§ããŸãã圌ãã¯ããªããžã§ã¯ãæåãæ©èœãã€ãã³ãé§ååããã°ã©ãã³ã°ãªã©ãäžè¬çãªãã©ãã€ã ã®å®è£
ã«é¢ããã¢ããã€ã¹ãç¶ããŠããŸããèè
ã¯ãŸãããªã¢ãŒããµãŒããŒãžã®ããã°ã©ã ã®å±éãèªååããæ¹æ³ã«ã€ããŠããã¹ãããŒãã³ã°ãã©ã¯ãã£ã¹ã«ã€ããŠã話ããŸããããªãã¯åŠã³ãŸããCãC ++ãCythonãCFFIã§äŸ¿å©ãªPythonæ¡åŒµæ©èœãäœæããæ¹æ³ã
ãã®æ¬ã¯èª°ã®ããã®ãã®ã§ãã
Python, . , Python. , , , Python.
, . , Python. , , . Python 3.7 , Python 2.7 .
- -, , : .
, . , Python. , , . Python 3.7 , Python 2.7 .
- -, , : .
æ¡åŒµå±æ§ã®ã¢ã¯ã»ã¹ãã¿ãŒã³
PythonãåŠã¶ãšããå€ãã®C ++ããã³Javaããã°ã©ããŒã¯ãprivateããŒã¯ãŒãããªãããšã«é©ããŠããŸããããã«æãè¿ãæŠå¿µã¯ååãã³ã°ãªã³ã°ã§ãã屿§ã®åã«__ãä»ããã³ã«ãã€ã³ã¿ããªã¿ã«ãã£ãŠåçã«ååã倿ŽãããŸãã
class MyClass:
__secret_value = 1
å ã®ååã§__secret_value屿§ã«ã¢ã¯ã»ã¹ãããšãAttributeErroräŸå€ãã¹ããŒãããŸãã
>>> instance_of = MyClass()
>>> instance_of.__secret_value
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'MyClass' object has no attribute '__secret_value'
>>> dir(MyClass)
['_MyClass__secret_value', '__class__', '__delattr__', '__dict__',
'__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
'__gt__', '__hash__', '__init__', '__le__', '__lt__', '__module__',
'__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__',
'__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']
>>> instance_of._MyClass__secret_value
1
ããã¯ã屿§ããã¬ãã£ãã¯ã¹ãšããŠã¯ã©ã¹åã«ãã£ãŠååã倿Žããããããç¶æ¿ã«ããååã®ç«¶åãåé¿ããããã«ç¹ã«è¡ãããŸãã屿§ã¯é£çµãããååãä»ããŠã¢ã¯ã»ã¹ã§ãããããããã¯ãã©ã€ããŒãã®æ£ç¢ºãªé¡äŒŒç©ã§ã¯ãããŸããããã®ããããã£ã¯ãäžéšã®å±æ§ãžã®ã¢ã¯ã»ã¹ãä¿è·ããããã«äœ¿çšã§ããŸãããå®éã«ã¯__ã¯äœ¿çšãããŸããã屿§ãå ¬éãããŠããªãå Žåã¯ãéåžžã_ãã¬ãã£ãã¯ã¹ã䜿çšããŸããååè£ é£Ÿã¢ã«ãŽãªãºã ã¯åŒã³åºãããŸãããã屿§ãã¯ã©ã¹ã®ãã©ã€ããŒãèŠçŽ ãšããŠææžåããäž»èŠãªã¹ã¿ã€ã«ã§ãã
Pythonã«ã¯ãã¯ã©ã¹ã®ãã©ã€ããŒãéšåãããããªãã¯éšåãåé¢ããä»ã®ã¡ã«ããºã ããããŸããèšè¿°åãšããããã£ã¯ããã®åé¢ãæŽçããæ¹æ³ãæäŸããŸãã
èšè¿°å
èšè¿°åã䜿çšãããšããªããžã§ã¯ãã®å±æ§ãåç §ãããšãã«çºçããã¢ã¯ã·ã§ã³ãã«ã¹ã¿ãã€ãºã§ããŸãã
èšè¿°åã¯ãPythonã®è€éãªå±æ§ã¢ã¯ã»ã¹ã®äžå¿ã§ãããããã¯ãããããã£ãã¡ãœãããã¯ã©ã¹ã¡ãœãããéçã¡ãœãããããã³ã¹ãŒããŒã¿ã€ããå®è£ ããããã«äœ¿çšãããŸãããããã¯ãå¥ã®ã¯ã©ã¹ã®å±æ§ã«ã¢ã¯ã»ã¹ããæ¹æ³ãå®çŸ©ããã¯ã©ã¹ã§ããã€ãŸããã¯ã©ã¹ã¯å±æ§ã®å¶åŸ¡ãå¥ã®ã¯ã©ã¹ã«å§ä»»ã§ããŸãã
èšè¿°åã¯ã©ã¹ã¯ãèšè¿°åãããã³ã«ã圢æãã3ã€ã®ç¹å¥ãªã¡ãœããã«åºã¥ããŠããŸã
ã__set __ïŒselfãobjãvalueïŒ-屿§ãèšå®ããããã³ã«åŒã³åºãããŸãã以äžã®äŸã§ã¯ãããããã»ãã¿ãŒããšåŒã³ãŸãã
__get __ïŒselfãobjãowner = NoneïŒ-屿§ãèªã¿åããããã³ã«åŒã³åºãããŸãïŒä»¥äžãã²ãã¿ãŒïŒã
__delete __ïŒselfãobjectïŒ-delã屿§ã«ãã£ãŠåŒã³åºããããšãã«åŒã³åºãããŸãã
__get__ãš__set__ãå®è£ ããèšè¿°åã¯ãããŒã¿èšè¿°åãšåŒã°ããŸãã__get__ãå®è£ ããã ãã®å ŽåãããŒã¿ãªãèšè¿°åãšåŒã°ããŸãã
ãã®ãããã³ã«ã®ã¡ãœããã¯ã屿§ãæ€çŽ¢ããããã³ã«ãå®éã«ã¯__getattribute __ïŒïŒã¡ãœããã«ãã£ãŠåŒã³åºãããŸãïŒç®çãç°ãªã__getattr __ïŒïŒãšæ··åããªãã§ãã ããïŒããã®ãããªã«ãã¯ã¢ãããããããŸãã¯çŽæ¥é¢æ°åŒã³åºãã䜿çšããŠå®è¡ãããå Žåã¯åžžã«ã__ getattribute __ïŒïŒã¡ãœãããæé»çã«åŒã³åºãããæ¬¡ã®é åºã§å±æ§ãæ€çŽ¢ãããŸãã
- 屿§ãã€ã³ã¹ã¿ã³ã¹ã¯ã©ã¹ã®ãªããžã§ã¯ãã®ããŒã¿èšè¿°åã§ãããã©ããã確èªããŸãã
- ããã§ãªãå Žåã¯ã屿§ãã€ã³ã¹ã¿ã³ã¹ãªããžã§ã¯ãã®__dict__ã«ãããã©ããã確èªããŸãã
- æåŸã«ã屿§ãã€ã³ã¹ã¿ã³ã¹ã¯ã©ã¹ãªããžã§ã¯ãã®ããŒã¿ã®ãªããã³ãã«ã§ãããã©ããã確èªããŸãã
ã€ãŸããããŒã¿èšè¿°åã¯__dict__ãããåªå ããã__ dict__ã¯éããŒã¿èšè¿°åãããåªå ãããŸãã
ããããããããããã«ãèšè¿°åãå®éã®ã³ãŒãã§ã©ã®ããã«æ©èœãããã瀺ãå ¬åŒã®Pythonããã¥ã¡ã³ãã®äŸã次ã«ç€ºããŸãã
class RevealAccess(object):
""" ,
"""
def __init__(self, initval=None, name='var'):
self.val = initval
self.name = name
def __get__(self, obj, objtype):
print('Retrieving', self.name)
return self.val
def __set__(self, obj, val):
print('Updating', self.name)
self.val = val
class MyClass(object):
x = RevealAccess(10, 'var "x"')
y = 5
ã€ã³ã¿ã©ã¯ãã£ãã«äœ¿çšããäŸã次ã«ç€ºããŸãã
>>> m = MyClass()
>>> m.x
Retrieving var "x"
10
>>> m.x = 20
Updating var "x"
>>> m.x
Retrieving var "x"
20
>>> m.y
5
ãã®äŸã¯ãã¯ã©ã¹ã«ãã®å±æ§ã®ããŒã¿èšè¿°åãããå Žåãã€ã³ã¹ã¿ã³ã¹å±æ§ãååŸããããã³ã«__get __ïŒïŒãåŒã³åºãããŠå€ãè¿ããããã®å±æ§ã«å€ãå²ãåœãŠããããã³ã«__set __ïŒïŒãåŒã³åºãããããšãæç¢ºã«ç€ºããŠããŸãã __del__ã¡ãœããã®äœ¿çšã¯åã®äŸã«ã¯ç€ºãããŠããŸããããæãããªã¯ãã§ããdelinstance.attributeãŸãã¯delatrïŒinstanceã 'attribute'ïŒã¹ããŒãã¡ã³ãã䜿çšããŠã€ã³ã¹ã¿ã³ã¹å±æ§ãåé€ããããã³ã«åŒã³åºãããŸãã
ãã®ãµãã»ã¯ã·ã§ã³ã®åé ã§è¿°ã¹ãçç±ã«ãããããŒã¿èšè¿°åãšéããŒã¿èšè¿°åã®éãã¯éèŠã§ããPythonã¯èšè¿°åãããã³ã«ã䜿çšããŠãã¡ãœãããä»ããŠã¯ã©ã¹é¢æ°ãã€ã³ã¹ã¿ã³ã¹ã«ãã€ã³ãããŸãããããã¯ãclassmethodããã³staticmethodãã³ã¬ãŒã¿ã«ãé©çšãããŸããããã¯ãæ©èœãªããžã§ã¯ããæ¬è³ªçã«ããŒã¿ã¬ã¹èšè¿°åã§ãããããã§ãã
>>> def function(): pass
>>> hasattr(function, '__get__')
True
>>> hasattr(function, '__set__')
False
ã©ã ãåŒã䜿çšããŠäœæããã颿°ã«ã€ããŠãåãããšãèšããŸãã
>>> hasattr(lambda: None, '__get__')
True
>>> hasattr(lambda: None, '__set__')
False
ãããã£ãŠã__ dict__ãããŒã¿ã¬ã¹èšè¿°åãããåªå ãããªãéããå®è¡æã«ãã§ã«ã€ã³ã¹ã¿ã³ã¹åãããŠããã€ã³ã¹ã¿ã³ã¹ã®ç¹å®ã®ã¡ãœãããåçã«ãªãŒããŒã©ã€ãããããšã¯ã§ããŸããã幞ããPythonã§èšè¿°åãæ©èœããæ¹æ³ã®ãããã§ãããã¯å¯èœã§ãããããã£ãŠãéçºè ã¯ããµãã¯ã©ã¹ã䜿çšããã«æ©èœããã€ã³ã¹ã¿ã³ã¹ãéžæã§ããŸãã
å®éã®äŸïŒå±æ§ã®é å»¶è©äŸ¡ãèšè¿°åã䜿çšãã1ã€ã®äŸã¯ãã€ã³ã¹ã¿ã³ã¹ããã¢ã¯ã»ã¹ããããšãã«ã¯ã©ã¹å±æ§ã®åæåãé ãããããšã§ããããã¯ããã®ãããªå±æ§ã®åæåãã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã³ã³ããã¹ãã«äŸåããå Žåã«åœ¹ç«ã¡ãŸãããã1ã€ã®ã±ãŒã¹ã¯ããã®ãããªåæåã«ã³ã¹ããããããããŠãã¯ã©ã¹ã®ã€ã³ããŒãåŸã«å±æ§ããŸã£ãã䜿çšããããã©ãããããããªãå Žåã§ãããã®ãããªèšè¿°åã¯ã次ã®ããã«å®è£ ã§ããŸãã
class InitOnAccess:
def __init__(self, klass, *args, **kwargs):
self.klass = klass
self.args = args
self.kwargs = kwargs
self._initialized = None
def __get__(self, instance, owner):
if self._initialized is None:
print('initialized!')
self._initialized = self.klass(*self.args, **self.kwargs)
else:
print('cached!')
return self._initialized
以äžã¯äœ¿çšäŸã§ãã
>>> class MyClass:
... lazily_initialized = InitOnAccess(list, "argument")
...
>>> m = MyClass()
>>> m.lazily_initialized
initialized!
['a', 'r', 'g', 'u', 'm', 'e', 'n', 't']
>>> m.lazily_initialized
cached!
['a', 'r', 'g', 'u', 'm', 'e', 'n', 't']
PyOpenGLãšåŒã°ããå ¬åŒã®PyPIOpenGL Pythonã©ã€ãã©ãªã¯ã次ã®ãããªææ³ã䜿çšããŠããã³ã¬ãŒã¿ãšããŒã¿èšè¿°åã®äž¡æ¹ã§ããlazy_propertyãªããžã§ã¯ããå®è£ ããŸãã
class lazy_property(object):
def __init__(self, function):
self.fget = function
def __get__(self, obj, cls):
value = self.fget(obj)
setattr(obj, self.fget.__name__, value)
return value
ãã®å®è£ ã¯ãããããã£ãã³ã¬ãŒã¿ã®äœ¿çšã«äŒŒãŠããŸããïŒåŸã§èª¬æããŸãïŒããã³ã¬ãŒã¿ã«ã©ããããã颿°ã¯1åã ãå®è¡ãããã¯ã©ã¹å±æ§ã¯ãã®é¢æ°ããããã£ã«ãã£ãŠè¿ãããå€ã«çœ®ãæããããŸãããã®æ¹æ³ã¯ã次ã®2ã€ã®èŠä»¶ãåæã«æºããå¿ èŠãããå Žåã«åœ¹ç«ã¡ãŸãã
- ãªããžã§ã¯ãã€ã³ã¹ã¿ã³ã¹ã¯ãïŒãªãœãŒã¹ãç¯çŽããããã«ïŒã€ã³ã¹ã¿ã³ã¹éã§å ±æãããã¯ã©ã¹å±æ§ãšããŠä¿åããå¿ èŠããããŸãã
- ãã®ãªããžã§ã¯ãã®äœæããã»ã¹ã¯ã¢ããªã±ãŒã·ã§ã³/ã³ã³ããã¹ãã®ã°ããŒãã«ãªç¶æ ã«äŸåããããããã®ãªããžã§ã¯ãã¯ã€ã³ããŒãæã«åæåã§ããŸããã
OpenGLã䜿çšããŠäœæãããã¢ããªã±ãŒã·ã§ã³ã®å Žåããã®ç¶æ³ã«ééããããšããããããŸããããšãã°ãOpenGLã§ã·ã§ãŒããŒãäœæããã«ã¯ãOpenGLã·ã§ãŒãã£ã³ã°èšèªïŒGLSLïŒã§èšè¿°ãããã³ãŒããã³ã³ãã€ã«ããå¿ èŠããããããã³ã¹ããããããŸããããããäžåºŠã ãäœæãããšåæã«ãããããå¿ èŠãšããã¯ã©ã¹ã®è¿ãã«ãããã®èª¬æãä¿æããããšã¯çã«ããªã£ãŠããŸããäžæ¹ãã·ã§ãŒããŒã®ã³ã³ãã€ã«ã¯ãOpenGLã³ã³ããã¹ããåæåããã«å®è¡ã§ããªããããã€ã³ããŒãæã«ã°ããŒãã«ã¢ãžã¥ãŒã«åå空éã§å®çŸ©ããã³ã¢ã»ã³ãã«ããããšã¯å°é£ã§ãã
次ã®äŸã¯ãããã€ãã®æœè±¡OpenGLã¢ããªã±ãŒã·ã§ã³ã§ã®lazy_property PyOpenGLãã³ã¬ãŒã¿ïŒããã§ã¯lazy_class_attributeïŒã®å€æŽããŒãžã§ã³ã®äœ¿çšã®å¯èœæ§ã瀺ããŠããŸããã¯ã©ã¹ã®ç°ãªãã€ã³ã¹ã¿ã³ã¹éã§å±æ§ãå ±æã§ããããã«ããã«ã¯ãå ã®lazy_propertyãã³ã¬ãŒã¿ã倿Žããå¿ èŠããããŸãã
import OpenGL.GL as gl
from OpenGL.GL import shaders
class lazy_class_attribute(object):
def __init__(self, function):
self.fget = function
def __get__(self, obj, cls):
value = self.fget(obj or cls)
# : -
#
setattr(cls, self.fget.__name__, value)
return value
class ObjectUsingShaderProgram(object):
# -
VERTEX_CODE = """
#version 330 core
layout(location = 0) in vec4 vertexPosition;
void main(){
gl_Position = vertexPosition;
}
"""
# ,
FRAGMENT_CODE = """
#version 330 core
out lowp vec4 out_color;
void main(){
out_color = vec4(1, 1, 1, 1);
}
"""
@lazy_class_attribute
def shader_program(self):
print("compiling!")
return shaders.compileProgram(
shaders.compileShader(
self.VERTEX_CODE, gl.GL_VERTEX_SHADER
),
shaders.compileShader(
self.FRAGMENT_CODE, gl.GL_FRAGMENT_SHADER
)
)
ãã¹ãŠã®é«åºŠãªPythonæ§ææ©èœãšåæ§ã«ããããæ³šæããŠäœ¿çšããã³ãŒãã§ååã«ææžåããå¿ èŠããããŸããçµéšã®æµ ãéçºè ã«ãšã£ãŠãèšè¿°åãã¯ã©ã¹ã®åäœã«åœ±é¿ãäžãããããã¯ã©ã¹ã®åäœã®å€æŽã¯é©ãã¹ãããšã§ãããããã£ãŠãããŒã ã®ãã¹ãŠã®ã¡ã³ããŒãèšè¿°åã«ç²ŸéããŠããããšã確èªãããã®æŠå¿µããããžã§ã¯ãã®ã³ãŒãããŒã¹ã§éèŠãªåœ¹å²ãæããå Žåã¯ããã®æŠå¿µãçè§£ããããšãéåžžã«éèŠã§ãã
ããããã£
ããããã£ã¯ã屿§ãäžé£ã®ã¡ãœããã«é¢é£ä»ããæ¹æ³ãç¥ã£ãŠããçµã¿èŸŒã¿ã®èšè¿°åã¿ã€ããæäŸããŸãããã®ããããã£ã¯ãfgetãfsetãfdelãããã³docã®4ã€ã®ãªãã·ã§ã³ã®åŒæ°ãåããŸããåŸè ã¯ã屿§ã«é¢é£ä»ããããdocstringãã¡ãœããã§ãããã®ããã«å®çŸ©ããããã«æäŸã§ããŸãã以äžã¯ã2ã€ã®ã³ãŒããŒãã€ã³ããä¿æãã屿§ã«çŽæ¥ã¢ã¯ã»ã¹ããããwidthããããã£ãšheightããããã£ã䜿çšããŠæäœã§ããRectangleã¯ã©ã¹ã®äŸã§ãã
class Rectangle:
def __init__(self, x1, y1, x2, y2):
self.x1, self.y1 = x1, y1
self.x2, self.y2 = x2, y2
def _width_get(self):
return self.x2 - self.x1
def _width_set(self, value):
self.x2 = self.x1 + value
def _height_get(self):
return self.y2 - self.y1
def _height_set(self, value):
self.y2 = self.y1 + value
width = property(
_width_get, _width_set,
doc="rectangle width measured from left"
)
height = property(
_height_get, _height_set,
doc="rectangle height measured from top"
)
def __repr__(self):
return "{}({}, {}, {}, {})".format(
self.__class__.__name__,
self.x1, self.y1, self.x2, self.y2
)
次ã®ã³ãŒãã¹ããããã¯ãã€ã³ã¿ã©ã¯ãã£ãã»ãã·ã§ã³ã§å®çŸ©ããããã®ãããªããããã£ã®äŸã瀺ããŠããŸãã
>>> rectangle.width, rectangle.height
(15, 24)
>>> rectangle.width = 100
>>> rectangle
Rectangle(10, 10, 110, 34)
>>> rectangle.height = 100
>>> rectangle
Rectangle(10, 10, 110, 110)
>>> help(Rectangle)
Help on class Rectangle in module chapter3:
class Rectangle(builtins.object)
| Methods defined here:
|
| __init__(self, x1, y1, x2, y2)
| Initialize self. See help(type(self)) for accurate signature.
|
| __repr__(self)
| Return repr(self).
|
| --------------------------------------------------------
| Data descriptors defined here:
| (...)
|
| height
| rectangle height measured from top
|
| width
| rectangle width measured from left
ãããã®ããããã£ã«ããèšè¿°åã®èšè¿°ã容æã«ãªããŸãããã¯ã©ã¹ç¶æ¿ã䜿çšããå Žåã¯æ³šæããŠåŠçããå¿ èŠããããŸãã屿§ã¯ãçŸåšã®ã¯ã©ã¹ã®ã¡ãœããã䜿çšããŠåçã«äœæãããæŽŸçã¯ã©ã¹ã§ãªãŒããŒã©ã€ããããã¡ãœããã¯é©çšãããŸããã
次ã®äŸã®ã³ãŒãã¯ã芪ã¯ã©ã¹ïŒRectangleïŒã®widthããããã£ããfgetã¡ãœããã®å®è£ ããªãŒããŒã©ã€ãããããšã¯ã§ããŸããã
>>> class MetricRectangle(Rectangle):
... def _width_get(self):
... return "{} meters".format(self.x2 - self.x1)
...
>>> Rectangle(0, 0, 100, 100).width
100
ãã®åé¡ã解決ããã«ã¯ãããããã£å šäœã掟çã¯ã©ã¹ã§äžæžãããå¿ èŠããããŸãã
>>> class MetricRectangle(Rectangle):
... def _width_get(self):
... return "{} meters".format(self.x2 - self.x1)
... width = property(_width_get, Rectangle.width.fset)
...
>>> MetricRectangle(0, 0, 100, 100).width
'100 meters'
æ®å¿µãªãããã³ãŒãã«ã¯ããã€ãã®ä¿å®æ§ã®åé¡ããããŸããéçºè ã芪ã¯ã©ã¹ã倿Žããããšã決å®ããããããããã£åŒã³åºããæŽæ°ããã®ãå¿ããå Žåãæ··ä¹±ãçããå¯èœæ§ããããŸããããããããããã£ã®åäœã®äžéšã®ã¿ããªãŒããŒã©ã€ãããããšãæšå¥šãããªãçç±ã§ãã芪ã¯ã©ã¹ã®å®è£ ã«äŸåãã代ããã«ã掟çã¯ã©ã¹ã®åäœæ¹æ³ã倿Žããå Žåã¯ã掟çã¯ã©ã¹ã®ãã¹ãŠã®ããããã£ã¡ãœãããæžãçŽãããšããå§ãããŸããã»ãã¿ãŒã®åäœã®ããããã£ã倿Žãããšãã²ãã¿ãŒã®åäœã倿Žããããããéåžžã¯ä»ã®ãªãã·ã§ã³ã¯ãããŸããã
ããããã£ãäœæããæè¯ã®æ¹æ³ã¯ãããããã£ããã³ã¬ãŒã¿ãšããŠäœ¿çšããããšã§ããããã«ãããã¯ã©ã¹å ã®ã¡ãœããã·ã°ããã£ã®æ°ãæžããã³ãŒããèªã¿ããããä¿å®ãããããªããŸãã
class Rectangle:
def __init__(self, x1, y1, x2, y2):
self.x1, self.y1 = x1, y1
self.x2, self.y2 = x2, y2
@property
def width(self):
""" """
return self.x2 - self.x1
@width.setter
def width(self, value):
self.x2 = self.x1 + value
@property
def height(self):
""" """
return self.y2 - self.y1
@height.setter
def height(self, value):
self.y2 = self.y1 + value
ã¹ããã
éçºè ããã£ãã«äœ¿çšããªãè峿·±ãæ©èœã¯ã¹ãããã§ãããããã䜿çšãããšã__ slots__屿§ã䜿çšããŠã¯ã©ã¹ã®å±æ§ã®éçãªã¹ããèšå®ããã¯ã©ã¹ã®ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã§__dict__ãã£ã¯ã·ã§ããªã®äœæãã¹ãããã§ããŸãã __dict__ã¯ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ã§äœæãããããã§ã¯ãªãããã屿§ãã»ãšãã©ãªãã¯ã©ã¹ã®ã¡ã¢ãªã¹ããŒã¹ãç¯çŽããããã«äœæãããŸããã
ãŸãã眲åãåçµããå¿ èŠãããã¯ã©ã¹ã®äœæã«ã圹ç«ã¡ãŸããããšãã°ãç¹å®ã®ã¯ã©ã¹ã®èšèªã®åçããããã£ãå¶éããå¿ èŠãããå Žåãã¹ãããã¯æ¬¡ã®ããšã«åœ¹ç«ã¡ãŸãã
>>> class Frozen:
... __slots__ = ['ice', 'cream']
...
>>> '__dict__' in dir(Frozen)
False
>>> 'ice' in dir(Frozen)
True
>>> frozen = Frozen()
>>> frozen.ice = True
>>> frozen.cream = None
>>> frozen.icy = True
Traceback (most recent call last): File "<input>", line 1, in <module>
AttributeError: 'Frozen' object has no attribute 'icy'
ãã®æ©èœã¯æ³šæããŠäœ¿çšããå¿ èŠããããŸãã䜿çšå¯èœãªå±æ§ã®ã»ãããã¹ãããã«å¶éãããŠããå Žåããªããžã§ã¯ãã«åçã«äœãã远å ããããšã¯ã¯ããã«å°é£ã§ããã¢ã³ããŒããããªã©ã®ããç¥ãããããªãã¯ã¯ãç¹å®ã®ã¹ããããæã€ã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã§ã¯æ©èœããŸããã幞ããç¬èªã«å®çŸ©ãããã¹ãããããªãå Žåã¯ã掟çã¯ã©ã¹ã«æ°ãã屿§ã远å ã§ããŸãã
>>> class Unfrozen(Frozen):
... pass
...
>>> unfrozen = Unfrozen()
>>> unfrozen.icy = False
>>> unfrozen.icy
False
èè ã«ã€ããŠ
MichalJaworskiã¯ã10幎ã®çµéšãæã€Pythonããã°ã©ããŒã§ãã圌ã¯ããŸããŸãªäŒæ¥ã§ããŸããŸãªåœ¹è·ãæŽä»»ããŠããŸãããéåžžã®ãã«ã¹ã¿ãã¯éçºè ããœãããŠã§ã¢ã¢ãŒããã¯ãããããŠæåŸã«ãã€ãããã¯ãªã¹ã¿ãŒãã¢ããäŒæ¥ã®éçºæ åœå¯ç€Ÿé·ãŸã§ã§ãã Michalã¯çŸåšãShowpadã®ã·ãã¢ããã¯ãšã³ããšã³ãžãã¢ã§ãã髿§èœåæ£ãµãŒãã¹ã®éçºã«è±å¯ãªçµéšããããŸããããã«ã圌ã¯å€ãã®ãªãŒãã³ãœãŒã¹Pythonãããžã§ã¯ãã«ç©æ¥µçã«è²¢ç®ããŠããŸãã
TarekZiadeã¯Pythonéçºè ã§ãããã©ã³ã¹ããã£ãžã§ã³è¿éã®ç°åå°åž¯ã«äœãã§ããŸãããµãŒãã¹ããŒã ã®Mozillaã§åããŠããŸãã Tarekã¯ãã©ã³ã¹èªã®PythonãŠãŒã¶ãŒã°ã«ãŒãïŒAfpyãšåŒã°ããïŒãèšç«ãããã©ã³ã¹èªãšè±èªã§Pythonã«é¢ããæ¬ãäœåãæžããŠããŸãããããã³ã°ãããŒãã£ãŒããè§£æŸãããæéã«ã¯ããžã§ã®ã³ã°ããã©ã³ãããã®æŒå¥ãªã©ããæ°ã«å ¥ãã®è¶£å³ã«åãçµãã§ããŸãã
圌ã®å人ããã°ïŒFetchez le PythonïŒã«ã¢ã¯ã»ã¹ããTwitterïŒtarek_ziadeïŒã§åœŒããã©ããŒããããšãã§ããŸãã
ç§åŠç·šéè ã«ã€ããŠ
Cody Jacksonã¯ããµã³ã¢ã³ãããªã«æ¬æ ã眮ãITããã³ããžãã¹ç®¡çã³ã³ãµã«ãã£ã³ã°äŒç€Ÿã§ããSocius Consultingã®åµèšè ã§ãããTop MenTechnologiesã®å ±ååµèšè ã§ããå士å·ãååŸããŠããŸãã圌ã¯çŸåšãICACIã€ã³ã¿ãŒãã·ã§ãã«ã§ICS / SCADAã¢ããªã³ã°ã®ãªãŒããšã³ãžãã¢ãšããŠåããŠããŸãã 1994幎以æ¥ãITæ¥çã§ã¯ãæ žååŠè ããã³ç¡ç·ãšã³ãžãã¢ãšããŠæµ·è»ã«å€åããŠä»¥æ¥ã CACIã®åã¯ãECPIã®å€§åŠã§ã³ã³ãã¥ãŒã¿ãŒæ å ±ã·ã¹ãã ã®å©ææãšããŠåããŠããŸãããç§ã¯èªåã§Pythonããã°ã©ãã³ã°ãåŠã³ããPythonã䜿ã£ãããã°ã©ãã³ã°ã®åŠç¿ããšãPythonå¿è ã®ç§å¯ã®ã¬ã·ãããšããæ¬ãæžããŸããã
ãã®æ¬ã®è©³çްã«ã€ããŠã¯ãåºç瀟 ã® Webãµã€ã
ã ç®æ¬¡
ããåç §ããŠãã ããã æç²
ã®ããã«å± äœè ã¯ãŒãã³ã§25ïŒ å²åŒ- Pythonã®
æžç±ã®çŽã®ããŒãžã§ã³ã®æ¯æãã®éã«ã¯ãé»åæžç±ã¯ãé»åã¡ãŒã«ã«éä¿¡ãããŸãã