คำถามติดแท็ก decorator

มัณฑนากรคือรูปแบบการออกแบบเชิงวัตถุที่ช่วยเพิ่มพฤติกรรมให้กับคลาสที่มีอยู่ในรูปแบบไดนามิก เป็นหนึ่งในรูปแบบการออกแบบโครงสร้างของ Gang of Four

5
“ มัณฑนากร” คืออะไรและใช้อย่างไร?
ฉันอยากรู้ว่านักตกแต่งคืออะไรใน AngularJS ไม่มีข้อมูลมากออนไลน์ตกแต่งประหยัดสำหรับการประกาศแจ้งในส่วนเอกสาร AngularJSและสั้น ๆ (แม้จะน่าสนใจ) กล่าวถึงในวิดีโอ YouTube ในฐานะที่เป็นคนเชิงมุมใส่มัณฑนากรคือ: ตกแต่งของบริการช่วยให้มัณฑนากรเพื่อสกัดกั้นการสร้างอินสแตนซ์ของบริการ อินสแตนซ์ที่ส่งคืนอาจเป็นอินสแตนซ์ดั้งเดิมหรืออินสแตนซ์ใหม่ที่มอบหมายให้กับอินสแตนซ์ดั้งเดิม ฉันไม่รู้จริงๆว่ามันหมายถึงอะไรและฉันไม่แน่ใจว่าทำไมคุณถึงแยกตรรกะนี้ออกจากบริการ ตัวอย่างเช่นถ้าฉันต้องการคืนบางสิ่งที่แตกต่างกันภายใต้เงื่อนไขที่แตกต่างกันฉันจะส่งข้อโต้แย้งที่แตกต่างกันไปยังฟังก์ชันที่เกี่ยวข้องหรือใช้ฟังก์ชั่นอื่นที่แบ่งปันสถานะส่วนตัวนั้น ฉันยังคงเป็น AngularJS noob ดังนั้นฉันแน่ใจว่ามันเป็นแค่ความไม่รู้และ / หรือนิสัยที่ไม่ดีที่ฉันเลือกมา

11
ตกแต่งงูหลามในชั้นเรียน
หนึ่งสามารถเขียนสิ่งที่ชอบ: class Test(object): def _decorator(self, foo): foo() @self._decorator def bar(self): pass สิ่งนี้ล้มเหลว: ไม่รู้จักตนเองใน @self ฉันก็ลอง: @Test._decorator(self) ซึ่งยังล้มเหลว: ทดสอบที่ไม่รู้จัก ฉันต้องการเปลี่ยนตัวแปรอินสแตนซ์ในมัณฑนากรชั่วคราวแล้วเรียกใช้วิธีการตกแต่งก่อนที่จะเปลี่ยนกลับ
140 python  class  decorator  self 

2
ความแตกต่างระหว่างรูปแบบการออกแบบ Facade, Proxy, Adapter และ Decorator? [ปิด]
ปิด . คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เน้นไปที่ปัญหาเดียวโดยแก้ไขโพสต์นี้เท่านั้น ปิดให้บริการใน5 ปีที่ผ่านมา ปรับปรุงคำถามนี้ รูปแบบการออกแบบ Facade, Proxy, Adapter และ Decorator แตกต่างกันอย่างไร ฉันไม่เคยอ่านคำอธิบายที่ชัดเจนว่าของคุณคืออะไร?

8
ความแตกต่างระหว่างพร็อกซีและรูปแบบมัณฑนากร
คุณสามารถให้คำอธิบายที่ดีใด ๆ สิ่งที่เป็นความแตกต่างระหว่างพร็อกซีและมัณฑนากร ? ความแตกต่างหลัก ๆ ที่ฉันเห็นคือเมื่อเราสมมติว่าProxyใช้องค์ประกอบและDecoratorใช้การรวมแล้วดูเหมือนว่าจะชัดเจนว่าโดยการใช้Decoratorsหลาย (หนึ่งหรือมากกว่า) คุณสามารถปรับเปลี่ยน / เพิ่มฟังก์ชันการทำงานเพื่ออินสแตนซ์ที่มีอยู่ก่อนพร็อกซีมีอินสแตนซ์ภายในของคลาสพร็อกซีและผู้รับมอบสิทธิ์เพิ่มคุณสมบัติเพิ่มเติม (ลักษณะการทำงานของพร็อกซี) คำถามคือ - พร็อกซีที่สร้างด้วยการรวมยังเป็นพร็อกซีหรือมากกว่ามัณฑนากรหรือไม่ อนุญาต (ตามคำจำกัดความในรูปแบบ GoF) เพื่อสร้างพร็อกซีที่มีการรวมหรือไม่

8
วิธีการตกแต่งชั้นเรียน?
ใน Python 2.5 มีวิธีสร้างมัณฑนากรที่ตกแต่งคลาสหรือไม่? โดยเฉพาะฉันต้องการใช้มัณฑนากรเพื่อเพิ่มสมาชิกในคลาสและเปลี่ยนตัวสร้างเพื่อรับค่าสำหรับสมาชิกนั้น ค้นหาสิ่งต่อไปนี้ (ซึ่งมีข้อผิดพลาดทางไวยากรณ์ใน 'class Foo:': def getId(self): return self.__id class addID(original_class): def __init__(self, id, *args, **kws): self.__id = id self.getId = getId original_class.__init__(self, *args, **kws) @addID class Foo: def __init__(self, value1): self.value1 = value1 if __name__ == '__main__': foo1 = Foo(5,1) print foo1.value1, foo1.getId() foo2 = …

7
นักตกแต่งใน python มาตรฐาน lib (@deprecated โดยเฉพาะ)
ฉันต้องทำเครื่องหมายกิจวัตรว่าเลิกใช้แล้ว แต่ดูเหมือนว่าไม่มีตัวตกแต่งห้องสมุดมาตรฐานสำหรับการเลิกใช้งาน ฉันทราบถึงสูตรอาหารและโมดูลคำเตือน แต่คำถามของฉันคือเหตุใดจึงไม่มีผู้ตกแต่งห้องสมุดมาตรฐานสำหรับงานนี้ (ทั่วไป) คำถามเพิ่มเติม: มีมัณฑนากรมาตรฐานในไลบรารีมาตรฐานหรือไม่?
128 python  decorator 

3
วิธีสร้างคุณสมบัตินามธรรมในคลาสนามธรรมของ python
Baseในรหัสต่อไปนี้ฉันจะสร้างฐานระดับนามธรรม ฉันต้องการให้คลาสทั้งหมดที่สืบทอดมาBaseเพื่อจัดหาnameคุณสมบัติดังนั้นฉันจึงสร้างคุณสมบัตินี้เป็น@abstractmethod. จากนั้นฉันก็สร้างคลาสย่อยที่Baseเรียกว่าBase_1ซึ่งมีไว้เพื่อจัดหาฟังก์ชันการทำงานบางอย่าง แต่ยังคงเป็นนามธรรม ไม่มีnameคุณสมบัติในBase_1แต่อย่างไรก็ตาม python จะติดตั้งอ็อบเจ็กต์ของคลาสนั้นโดยไม่มีข้อผิดพลาด หนึ่งสร้างคุณสมบัติที่เป็นนามธรรมได้อย่างไร? from abc import ABCMeta, abstractmethod class Base(object): __metaclass__ = ABCMeta def __init__(self, strDirConfig): self.strDirConfig = strDirConfig @abstractmethod def _doStuff(self, signals): pass @property @abstractmethod def name(self): #this property will be supplied by the inheriting classes #individually pass class Base_1(Base): __metaclass__ = ABCMeta # …

2
รูปแบบ Ruby on Rails - มัณฑนากรกับผู้นำเสนอ
ช่วงนี้มีการพูดคุยกันทุกประเภทในชุมชน Ruby on Rails เกี่ยวกับมัณฑนากรและผู้นำเสนอ อะไรคือความแตกต่างที่สำคัญระหว่างทั้งสอง? ถ้ามีอะไรคือเบาะแสที่บอกฉันว่าควรใช้อันไหนกับอีกอัน? หรืออาจจะใช้ทั้งสองร่วมกัน?

6
การรักษาลายเซ็นของฟังก์ชันตกแต่ง
สมมติว่าฉันเขียนมัณฑนากรที่ทำอะไรธรรมดา ๆ ตัวอย่างเช่นอาจแปลงอาร์กิวเมนต์ทั้งหมดเป็นประเภทเฉพาะดำเนินการบันทึกใช้การบันทึก ฯลฯ นี่คือตัวอย่าง: def args_as_ints(f): def g(*args, **kwargs): args = [int(x) for x in args] kwargs = dict((k, int(v)) for k, v in kwargs.items()) return f(*args, **kwargs) return g @args_as_ints def funny_function(x, y, z=3): """Computes x*y + 2*z""" return x*y + 2*z >>> funny_function("3", 4.0, z="5") 22 ทุกอย่างดีจนถึงตอนนี้ …
111 python  decorator 

8
Python การบันทึก / การค้นหาคุณสมบัติรอการตัดบัญชี
เมื่อเร็ว ๆ นี้ฉันได้อ่านฐานรหัสที่มีอยู่ซึ่งมีคลาสมากมายที่แอตทริบิวต์ของอินสแตนซ์แสดงถึงค่าที่เก็บไว้ในฐานข้อมูล ฉันได้ปรับโครงสร้างใหม่จำนวนมากเพื่อให้การค้นหาฐานข้อมูลถูกเลื่อนออกไปเช่น ไม่ได้เริ่มต้นในตัวสร้าง แต่เมื่ออ่านครั้งแรกเท่านั้น แอตทริบิวต์เหล่านี้จะไม่เปลี่ยนแปลงตลอดอายุการใช้งานของอินสแตนซ์ แต่เป็นคอขวดที่แท้จริงในการคำนวณครั้งแรกและเข้าถึงได้เฉพาะกรณีพิเศษเท่านั้น ดังนั้นจึงสามารถแคชได้หลังจากที่ดึงข้อมูลจากฐานข้อมูลแล้ว (ดังนั้นจึงเหมาะกับคำจำกัดความของบันทึกช่วยจำโดยที่อินพุตเป็นเพียง "ไม่มีอินพุต") ฉันพบว่าตัวเองกำลังพิมพ์ข้อมูลโค้ดต่อไปนี้ซ้ำแล้วซ้ำอีกสำหรับแอตทริบิวต์ต่างๆในคลาสต่างๆ: class testA(object): def __init__(self): self._a = None self._b = None @property def a(self): if self._a is None: # Calculate the attribute now self._a = 7 return self._a @property def b(self): #etc มีมัณฑนากรที่ทำสิ่งนี้แล้วใน Python ที่ฉันไม่รู้หรือไม่? หรือมีวิธีง่ายๆในการกำหนดมัณฑนากรที่ทำสิ่งนี้หรือไม่? ฉันทำงานภายใต้ Python 2.5 …
109 python  decorator 

13
ผู้ตกแต่งวิธีการอินสแตนซ์สามารถเข้าถึงคลาสได้หรือไม่?
ฉันมีบางอย่างคร่าวๆดังต่อไปนี้ โดยทั่วไปฉันต้องเข้าถึงคลาสของวิธีอินสแตนซ์จากมัณฑนากรที่ใช้กับวิธีอินสแตนซ์ในคำจำกัดความ def decorator(view): # do something that requires view's class print view.im_class return view class ModelA(object): @decorator def a_method(self): # do some stuff pass รหัสตามที่ให้: AttributeError: วัตถุ 'function' ไม่มีแอตทริบิวต์ 'im_class' ฉันพบคำถาม / คำตอบที่คล้ายกัน - มัณฑนากร Python ทำให้ฟังก์ชันลืมไปว่ามันเป็นของคลาสและรับคลาสในมัณฑนากร Python - แต่สิ่งเหล่านี้ต้องอาศัยวิธีแก้ปัญหาที่จับอินสแตนซ์ในขณะรันไทม์โดยการฉกพารามิเตอร์แรก ในกรณีของฉันฉันจะเรียกใช้เมธอดตามข้อมูลที่รวบรวมจากคลาสของมันดังนั้นฉันจึงแทบรอไม่ไหวให้โทรเข้ามา
109 python  decorator 

5
Webpack babel 6 ES6 มัณฑนากร
ฉันมีโปรเจ็กต์ที่เขียนด้วย ES6 โดยมี webpack เป็นบันเดิลเลอร์ การถ่ายโอนข้อมูลส่วนใหญ่ทำงานได้ดี แต่เมื่อฉันพยายามรวมมัณฑนากรไว้ที่ใดก็ได้ฉันได้รับข้อผิดพลาดนี้: Decorators are not supported yet in 6.x pending proposal update. ฉันได้ตรวจสอบตัวติดตามปัญหาของ babel แล้วและไม่พบสิ่งใดในนั้นดังนั้นฉันจึงคิดว่าฉันใช้ผิด การกำหนดค่า webpack ของฉัน (บิตที่เกี่ยวข้อง): loaders: [ { loader: 'babel', exclude: /node_modules/, include: path.join(__dirname, 'src'), test: /\.jsx?$/, query: { plugins: ['transform-runtime'], presets: ['es2015', 'stage-0', 'react'] } } ] ฉันไม่มีปัญหากับสิ่งอื่นใดฟังก์ชันลูกศรการทำลายทุกอย่างทำงานได้ดีนี่เป็นสิ่งเดียวที่ใช้ไม่ได้ ฉันรู้ว่าฉันสามารถปรับลดรุ่นเป็น babel …

1
คำสั่งการดำเนินการของมัณฑนากร
def make_bold(fn): return lambda : "<b>" + fn() + "</b>" def make_italic(fn): return lambda : "<i>" + fn() + "</i>" @make_bold @make_italic def hello(): return "hello world" helloHTML = hello() เอาท์พุต: "<b><i>hello world</i></b>" ฉันเข้าใจคร่าวๆเกี่ยวกับมัณฑนากรและวิธีการทำงานกับหนึ่งในตัวอย่างส่วนใหญ่ ในตัวอย่างนี้มี 2 ตัว จากการส่งออกมันก็ดูเหมือนว่ารันแรกแล้ว@make_italic@make_bold หมายความว่าสำหรับฟังก์ชั่นตกแต่งขั้นแรกจะเรียกใช้ฟังก์ชันก่อนจากนั้นจึงเลื่อนไปด้านบนสำหรับมัณฑนากรอื่น ๆ หรือไม่? ชอบ@make_italicก่อนแล้ว@make_boldแทนที่จะตรงกันข้าม นั่นหมายความว่ามันแตกต่างจากบรรทัดฐานของวิธีการจากบนลงล่างในภาษาการเขียนโปรแกรมส่วนใหญ่? สำหรับมัณฑนากรกรณีนี้เท่านั้นหรือ หรือว่าฉันผิด?

3
การกำหนดว่า root logger ถูกตั้งค่าเป็นระดับ DEBUG ใน Python หรือไม่?
หากฉันตั้งค่าโมดูลการบันทึกเป็น DEBUG ด้วยพารามิเตอร์บรรทัดคำสั่งเช่นนี้: if (opt["log"] == "debug"): logging.basicConfig(level=logging.DEBUG) ฉันจะทราบได้อย่างไรในภายหลังว่าคนตัดไม้ถูกตั้งค่าเป็นดีบัก ฉันกำลังเขียนมัณฑนากรที่จะกำหนดเวลาของฟังก์ชันหาก True flag ถูกส่งผ่านไปและหากไม่มีการตั้งค่าสถานะจะใช้ค่าเริ่มต้นในการพิมพ์ข้อมูลเวลาเมื่อ root logger ตั้งค่าเป็น DEBUG

13
วิธีสร้างมัณฑนากร Python ที่สามารถใช้ได้ทั้งแบบมีหรือไม่มีพารามิเตอร์?
ฉันต้องการสร้างมัณฑนากร Python ที่สามารถใช้ได้กับพารามิเตอร์: @redirect_output("somewhere.log") def foo(): .... หรือไม่มี (เช่นเปลี่ยนเส้นทางเอาต์พุตไปยัง stderr ตามค่าเริ่มต้น): @redirect_output def foo(): .... เป็นไปได้หรือไม่? โปรดทราบว่าฉันไม่ได้มองหาวิธีแก้ไขปัญหาการเปลี่ยนเส้นทางเอาต์พุตที่แตกต่างออกไป แต่เป็นเพียงตัวอย่างของไวยากรณ์ที่ฉันต้องการบรรลุเท่านั้น
90 python  decorator 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.