คำถามติดแท็ก python-decorators


17
วิธีที่จะทำให้ห่วงโซ่ของนักตกแต่งฟังก์ชั่นหรือไม่?
ฉันจะสร้างสองนักตกแต่งใน Python ที่จะทำสิ่งต่อไปนี้ได้อย่างไร? @makebold @makeitalic def say(): return "Hello" ... ซึ่งควรกลับมา: "<b><i>Hello</i></b>" ฉันไม่ได้พยายามทำHTMLสิ่งนี้ในแอปพลิเคชันจริง - เพียงแค่พยายามเข้าใจว่านักตกแต่งและนักตกแต่งภายในทำงานอย่างไร

14
มัณฑนากร @property ทำงานอย่างไร
ฉันต้องการที่จะเข้าใจว่าฟังก์ชั่นในตัวทำงานpropertyอย่างไร สิ่งที่ทำให้ฉันสับสนคือpropertyสามารถใช้เป็นมัณฑนากรได้ แต่ใช้อาร์กิวเมนต์เมื่อใช้เป็นฟังก์ชันในตัวเท่านั้นไม่ใช่เมื่อใช้เป็นมัณฑนากร ตัวอย่างนี้มาจากเอกสาร : class C(object): def __init__(self): self._x = None def getx(self): return self._x def setx(self, value): self._x = value def delx(self): del self._x x = property(getx, setx, delx, "I'm the 'x' property.") propertyข้อโต้แย้งของมีgetx, setx, delxและสตริง doc ในรหัสด้านล่างpropertyใช้เป็นมัณฑนากร วัตถุของมันคือxฟังก์ชั่น แต่ในรหัสข้างต้นไม่มีสถานที่สำหรับฟังก์ชั่นวัตถุในการขัดแย้ง class C(object): def __init__(self): self._x = None @property …

12
สัญลักษณ์“ at” (@) ทำอะไรใน Python
ฉันกำลังดูโค้ด Python บางตัวที่ใช้@สัญลักษณ์ แต่ฉันไม่รู้ว่ามันทำอะไร ฉันไม่ทราบด้วยว่าจะค้นหาสิ่งใดในการค้นหา Python docs หรือ Google จะไม่แสดงผลลัพธ์ที่เกี่ยวข้องเมื่อ@มีการรวมสัญลักษณ์

11
ฉันจะหลีกเลี่ยง“ self.x = x ได้อย่างไร self.y = y; รูปแบบ self.z = z” ใน __init__?
ฉันเห็นรูปแบบที่ชอบ def __init__(self, x, y, z): ... self.x = x self.y = y self.z = z ... ค่อนข้างบ่อยบ่อยครั้งที่มีพารามิเตอร์มากขึ้น มีวิธีที่ดีในการหลีกเลี่ยงการทำซ้ำที่น่าเบื่อนี้หรือไม่? คลาสควรสืบทอดจากnamedtupleแทนหรือไม่?

5
มัณฑนากรวิธีการเรียนที่มีข้อโต้แย้งตัวเอง?
ฉันจะส่งฟิลด์คลาสไปยัง decorator บนเมธอด class เป็นอาร์กิวเมนต์ได้อย่างไร สิ่งที่ฉันต้องการจะทำคือ: class Client(object): def __init__(self, url): self.url = url @check_authorization("some_attr", self.url) def get(self): do_work() มันบ่นว่าตัวเองไม่มีอยู่สำหรับการส่งผ่านself.urlไปยังมัณฑนากร มีวิธีแก้ไขไหม?

10
ตัวอย่างโลกแห่งความจริงเกี่ยวกับวิธีการใช้คุณสมบัติคุณสมบัติในหลาม?
ฉันสนใจวิธีใช้งาน@propertyPython ฉันอ่าน python docs แล้วและตัวอย่างในความคิดของฉันเป็นเพียงรหัสของเล่น: 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 ฉันไม่รู้ว่าฉันจะได้ประโยชน์อะไรจากการห่อหุ้ม_xด้วยมัณฑนากร ทำไมไม่ใช้เพียงแค่เป็น: class C(object): def __init__(self): self.x = None ฉันคิดว่าคุณสมบัติคุณสมบัติอาจมีประโยชน์ในบางสถานการณ์ แต่เมื่อ? ใครช่วยกรุณายกตัวอย่างจริง ๆ ให้ฉันได้บ้าง ขอบคุณ

5
ฉันจะส่งอาร์กิวเมนต์พิเศษไปยังมัณฑนากร Python ได้อย่างไร
ฉันมีมัณฑนากรเช่นด้านล่าง def myDecorator(test_func): return callSomeWrapper(test_func) def callSomeWrapper(test_func): return test_func @myDecorator def someFunc(): print 'hello' ฉันต้องการปรับปรุงมัณฑนากรนี้ให้ยอมรับข้อโต้แย้งอื่นเช่นด้านล่าง def myDecorator(test_func,logIt): if logIt: print "Calling Function: " + test_func.__name__ return callSomeWrapper(test_func) @myDecorator(False) def someFunc(): print 'Hello' แต่รหัสนี้ให้ข้อผิดพลาด TypeError: myDecorator () รับ 2 อาร์กิวเมนต์ (ให้ 1 ตัว) เหตุใดฟังก์ชันจึงไม่ผ่านโดยอัตโนมัติ ฉันจะส่งฟังก์ชันนี้ไปยังฟังก์ชันมัณฑนากรอย่างชัดเจนได้อย่างไร

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แทนที่จะตรงกันข้าม นั่นหมายความว่ามันแตกต่างจากบรรทัดฐานของวิธีการจากบนลงล่างในภาษาการเขียนโปรแกรมส่วนใหญ่? สำหรับมัณฑนากรกรณีนี้เท่านั้นหรือ หรือว่าฉันผิด?

5
จะบายพาสนิยามฟังก์ชัน python ด้วย decorator ได้อย่างไร?
ฉันอยากจะรู้ว่ามันเป็นไปได้ในการควบคุมการกำหนดฟังก์ชั่น Python ตามการตั้งค่าทั่วโลก (เช่น OS) ตัวอย่าง: @linux def my_callback(*args, **kwargs): print("Doing something @ Linux") return @windows def my_callback(*args, **kwargs): print("Doing something @ Windows") return จากนั้นหากมีใครใช้ Linux คำจำกัดความแรกของmy_callbackจะถูกนำมาใช้และคำที่สองจะถูกเพิกเฉยอย่างเงียบ ๆ มันไม่เกี่ยวกับการพิจารณาระบบปฏิบัติการมันเกี่ยวกับฟังก์ชั่นนิยาม / มัณฑนากร
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.