PHP рдореЗрдВ
рджреНрд░рд╡ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рд╣рд╛рд▓рд┐рдпрд╛ рдкреЛрд╕реНрдЯ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рд╣реЛрдХрд░, рдореИрдВрдиреЗ рддреБрд░рдВрдд рд╕реЛрдЪрд╛ рдХрд┐ рдХреИрд╕реЗ рдЗрд╕реЗ рдЕрдЬрдЧрд░ рдореЗрдВ рдЖрд╕рд╛рди рдФрд░ рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рдП (рдЕрдЬрдЧрд░ рд╣рдореЗрд╢рд╛ рд╕рд░рд▓ рдФрд░ рдЕрдзрд┐рдХ рд╕реБрдВрджрд░ рд╣реЛрддрд╛ рд╣реИ)ред рдореИрдВ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреА рдкреНрд░рд╛рдкреНрддрд┐ рдХреЗ рдХреНрд░рдо рдореЗрдВ рдХрдИ рддрд░реАрдХреЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВред

рдкрд╣рд▓рд╛ рддрд░реАрдХрд╛ - рдорд╛рдереЗ рдореЗрдВ
рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдХрдХреНрд╖рд╛ рдХреА рдПрдХ рдЖрд╡реГрддреНрддрд┐ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдпрд╣ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
def add(self,x): self.val += x return self
рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдереЛрдбрд╝рд╛ рдФрд░ рддрд▓рд╛рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред
рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ - рд╕рдЬреНрдЬрд╛рдХрд╛рд░
рдпрд╣ рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдЬреЛ рдорди рдореЗрдВ рдЖрдпрд╛ред рдХрдХреНрд╖рд╛ рдореЗрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВред рд╣рдо рдмрд╣реБрдд рдЦреБрд╢ рд╣реИрдВ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЛ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
def chained(fn): def new(*args,**kwargs): fn(*args,**kwargs) return args[0] return new class UsefulClass1(): def __init__(self,val): self.val = val @chained def add(self,val): self.val += val @chained def mul(self,val): self.val *= val
рд╣рдо рдмрд╕ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдЙрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд╡рд╛рдкрд╕реА рдорд╛рди рдХреЛ рдирдЬрд░рдЕрдВрджрд╛рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХ рд╡рд░реНрдЧ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
>>> print UsefulClass1(10).add(5).mul(10).add(1).val 151
рд╡рд┐рдзрд┐ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реИ - рдЖрдк рддреБрд░рдВрдд рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рд╢реНрд░реГрдВрдЦрд▓рд╛ рдореЗрдВ рдХрд┐рди рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдорддреМрд░ рдкрд░ рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд░реНрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рддрдХ рдлреИрд▓рд╛ рд╣реБрдЖ рд╣реИ рдЬреЛ рдПрдХ рд╕рдордп рдореЗрдВ рдПрдХ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИрдВред
рддреАрд╕рд░рд╛ рддрд░реАрдХрд╛ - рд╕реНрд╡рдЪрд╛рд▓рд┐рдд
рдХрд┐рд╕реА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рд░рд┐рдЯрд░реНрди рдорд╛рди рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдореЗрдВ, рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рд╕реНрд╡рдпрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рд╡рд░реНрдЧ рдХреЗ рддрд░реАрдХреЛрдВ рдФрд░ рдХреНрд╖реЗрддреНрд░реЛрдВ рддрдХ рдХрд┐рд╕реА рднреА рдкрд╣реБрдВрдЪ рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реБрдП, __getattribute__ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдРрд╕рд╛ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдмрд╕ рдПрдХ рд╡рд░реНрдЧ рдХреЛ рд╕рдорд╛рди рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд╕рд╛рде рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдЗрд╕рдореЗрдВ рд╕реЗ рд╕рднреА рдХрд╛рдордХрд╛рдЬреА рд╡рд░реНрдЧреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред
from types import MethodType class Chain(object): def __getattribute__(self,item): fn = object.__getattribute__(self,item) if fn and type(fn)==MethodType: def chained(*args,**kwargs): ans = fn(*args,**kwargs) return ans if ans!=None else self return chained return fn class UsefulClass2(Chain): val = 1 def add(self,val): self.val += val def mul(self,val): self.val *= val def third(self): return 386
рдпрджрд┐ рд╡рд┐рдзрд┐ рдПрдХ рдорд╛рди рд▓реМрдЯрд╛рддреА рд╣реИ, рддреЛ рдЗрд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдХрдХреНрд╖рд╛ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЦреБрдж рд╣реА рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
>>> print UsefulClass2().add(15).mul(16).add(-5).val 251 >>> print UsefulClass2().third() 386
рдЕрдм рд╣рдореЗрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рд╢реНрд░рдорд┐рдХ рд╡рд░реНрдЧ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рдЬрдВрдЬреАрд░ рд╡рд░реНрдЧ рдХреЛ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред рд╕реНрдкрд╖реНрдЯ рджреЛрд╖ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдЙрджреНрджреЗрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП __getattribute__ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЪреМрдерд╛ рддрд░реАрдХрд╛ - Im So Meta ...
рд╢реНрд░рдорд┐рдХ рд╡рд░реНрдЧ рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╡рд░рдг рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдореЗрдЯрд╛рдХреНрд▓рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдмрд╛рдж рдХреЛ рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдордХреНрдЦреА рдкрд░ __getattribute__ рд▓рдкреЗрдЯреЗрдВрдЧреЗ (рдФрд░ рдЗрд╕рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рд╣рдореЗрдВ рдпрд╛ рддреЛ рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рдХрд░рддреА рд╣реИ)ред
from types import MethodType class MetaChain(type): def __new__(cls,name,bases,dict): old = dict.get('__getattribute__',object.__getattribute__) def new_getattribute(inst,val): attr = old(inst,val) if attr==None: return inst if attr and type(attr)==MethodType: def new(*args,**kwargs): ans = attr(*args,**kwargs) return ans if ans!=None else inst return new return attr dict['__getattribute__'] = new_getattribute return type.__new__(cls,name,bases,dict) class UsefulClass3(): __metaclass__ = MetaChain def __getattribute__(self,item): if item=="dp": return 493 return object.__getattribute__(self,item) val = 1 def add(self,val): self.val += val def mul(self,val): self.val *= val
рдпрд╣ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдкрд┐рдЫрд▓реЗ рдПрдХ рд╕реЗ рдЕрд▓рдЧ рдирд╣реАрдВ рд╣реИ - рд╣рдо рдХреЗрд╡рд▓ рдореЗрдЯрд╛рдХреНрд▓реЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ __getattribute__ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╢реНрд░рдорд┐рдХ рд╡рд░реНрдЧ рдХреЛ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ __metaclass__ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред
>>> print UsefulClass3().dp 493 >>> print UsefulClass3().add(4).mul(5).add(1).mul(25).add(-1).val 649
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, __getattribute__ рдореВрд▓ рд░реВрдк рд╕реЗ рд╢реНрд░рдорд┐рдХ рд╡рд░реНрдЧ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред рдЬрдм рд╢реНрд░рдорд┐рдХ рд╡рд░реНрдЧ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛, рддреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╣реИ - __getattribute__ рднреА рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рдпрджрд┐ рдореВрд▓ __getattribute__ рдХреБрдЫ рднреА (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдЯреНрд░реАрдмреНрдпреВрдЯ) рднреА рд╡рд╛рдкрд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рднреА рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВред
рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмрдЬрд╛рдп
рдпрджреНрдпрдкрд┐ рджреНрд░рд╡ рдЗрдВрдЯрд░рдлреЗрд╕ рдХрд╛ рд╕рд░реНрд╡рд╡реНрдпрд╛рдкреА рдЙрдкрдпреЛрдЧ рд╕рдВрджрд┐рдЧреНрдз рд╣реИ, рдлрд┐рд░ рднреА рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдРрд╕реА рд╕рдВрд░рдЪрдирд╛рдПрдВ рдЙрдкрдпреБрдХреНрдд рд╣реЛрдВрдЧреАред рдХрд╣реЛ, рдЫрд╡рд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдпрд╛ рдХрд┐рд╕реА рднреА рд╕рдВрд╕реНрдерд╛ рдЬрд┐рд╕рдХреЗ рдКрдкрд░ рдХрдИ рд╕рдВрдЪрд╛рд▓рди рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
PS рдЕрдВрддрд┐рдо рд╡рд┐рдХрд▓реНрдк, рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдЗрд╕рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рдХрдорд┐рдпрд╛рдБ рдирд╣реАрдВ рд╣реИрдВред рдЕрдЧрд░ рдХреЛрдИ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рджреЗ рд╕рдХрддрд╛ рд╣реИ - рддреЛ рдореБрдЭреЗ рдЦреБрд╢реА рд╣реЛрдЧреА, рд╕рд╛рде рд╣реА рдореЗрд░реА рдХрдорд┐рдпреЛрдВ рдХреЗ рд╕рдВрдХреЗрдд рднреА рдорд┐рд▓реЗрдВрдЧреЗред
PPS рд╢реНрд░рдорд┐рдХреЛрдВ рдХреЗ рдЕрдиреБрд░реЛрдз
рдкрд░, рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд▓реЗрдЦ рдФрд░
рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдВрдХ рджреЗрддрд╛ рд╣реИ
рдЕрджреНрдпрддрдирдкрд╛рдВрдЪрд╡реАрдВ рд╡рд┐рдзрд┐ - рднреБрдЯреНрдЯрд╛ рдФрд░ рдЪреВрд▓реНрд╣рд╛
рдЯрд╡ред
рджрд╛рд╡рд┐рдВрдЪреА рдиреЗ рдареАрдХ рд╣реА рдХрд╣рд╛ рдХрд┐ рд╣рд░ рдХреЙрд▓ рдкрд░ рд░реИрдк рдХрдо рд╕реЗ рдХрдо рдЕрдЬреАрдм рд╣реИред рд╕рд╛рде рд╣реА, рд╣рдо рд╣рд░ рдмрд╛рд░ рд╡рд╕реНрддреБ рдХреЗ рдХреНрд╖реЗрддреНрд░ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЬрд╛рдБрдЪ рдЪрд▓рд╛рддреЗ рд╣реИрдВред
рдЕрдм рд╣рдо рдПрдХ рд╣реА рдмрд╛рд░ рдореЗрдВ рд╕рднреА рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╣рдо рдЙрдиреНрд╣реЗрдВ рд▓рдкреЗрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рддрд░реАрдХреЛрдВ рдХреЗ рд╕рдВрд╢реЛрдзрди рдФрд░ рдирд┐рд░реНрдорд╛рдг рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗред
class NewMetaChain(type): def __new__(cls,name,bases,dict): old = dict.get('__setattr__',object.__setattr__) def wrap(fn,inst=None): def new(*args,**kwargs): ans = fn(*args,**kwargs) return ans if ans!=None else inst or args[0] return new special = dir(cls) for item, fn in dict.items(): if item not in special and isinstance(fn,FunctionType): dict[item] = wrap(fn) def new_setattr(inst,item,val): if isinstance(val,FunctionType): val = wrap(val,inst) return old(inst,item,val) dict['__setattr__'] = new_setattr return type.__new__(cls,name,bases,dict) class UsefulClass4(): __metaclass__ = NewMetaChain def __setattr__(self,item,val): if val == 172: val = "giza" object.__setattr__(self, item, val) val = 1 def add(self,val): self.val += val def mul(self,val): self.val *= val def nul(self): pass
рдЗрд╕ рддрдереНрдп рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐ рдЕрдм рд╣рдо рд╣рд░ рдХреЙрд▓ рдХреЗ рд╕рд╛рде рд░реИрдк рд╡рд┐рдзрд┐рдпрд╛рдВ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рдЬреЛ рдХрд┐ рдЧрддрд┐ рдореЗрдВ ~ 30% рдХреА рд╡реГрджреНрдзрд┐ рд╣реБрдИ рд╣реИ), рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдЪреЗрдХ рдХреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд░реАрдбрд┐рдВрдЧ рдкрд░ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рдХреЙрд░реНрдб рдкрд░ рднреА рдХрд░рддреЗ рд╣реИрдВ (рдЬреЛ рдЕрдХреНрд╕рд░ рдХрдо рд╣реЛрддрд╛ рд╣реИ)ред рдпрджрд┐ рдХреЛрдИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдирд╣реАрдВ рд╣реИ, рддреЛ рдпрд╣ рдбреЗрдХреЛрд░реЗрдЯрд░ рд╡рд┐рдзрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред