คำถามติดแท็ก class-method

18
ความแตกต่างระหว่างวิธีการเรียนและอินสแตนซ์คืออะไร?
ความแตกต่างระหว่างวิธีการเรียนและวิธีการอินสแตนซ์คืออะไร? อินสแตนซ์เป็น accessors (getters และ setters) ในขณะที่เมธอด class นั้นค่อนข้างทุกอย่างหรือไม่?

9
Ruby: การเรียกคลาสเมธอดจากอินสแตนซ์
ใน Ruby คุณจะเรียกวิธีการเรียนจากอินสแตนซ์ของคลาสนั้นได้อย่างไร บอกว่าฉันมี class Truck def self.default_make # Class method. "mac" end def initialize # Instance method. Truck.default_make # gets the default via the class's method. # But: I wish to avoid mentioning Truck. Seems I'm repeating myself. end end บรรทัดTruck.default_makeดึงค่าเริ่มต้น แต่มีวิธีพูดแบบนี้โดยไม่เอ่ยถึงTruckหรือไม่? ดูเหมือนว่าควรจะมี
347 ruby  class-method 

16
จุดประสงค์ของวิธีการเรียนคืออะไร?
ฉันสอนตัวเอง Python และบทเรียนล่าสุดของฉันคือPython ไม่ใช่ Javaดังนั้นฉันจึงใช้เวลาสักครู่เพื่อเปลี่ยนวิธีการเรียนทั้งหมดของฉันให้เป็นฟังก์ชั่น ตอนนี้ฉันรู้ว่าฉันไม่จำเป็นต้องใช้วิธีการแบบคลาสสำหรับสิ่งที่ฉันจะทำกับstaticวิธีการใน Java แต่ตอนนี้ฉันไม่แน่ใจว่าจะใช้พวกเขาเมื่อใด คำแนะนำทั้งหมดที่ฉันสามารถค้นหาเกี่ยวกับวิธีการเรียนของ Python นั้นเป็นไปตามแนวทางของมือใหม่อย่างที่ฉันควรหลีกเลี่ยงและเอกสารมาตรฐานนั้นทึบแสงที่สุดเมื่อพูดถึงพวกเขา มีใครบ้างที่เป็นตัวอย่างที่ดีของการใช้วิธีการเรียนแบบชั้นเรียนใน Python หรืออย่างน้อยก็มีคนบอกฉันได้ว่าวิธีการเรียนแบบชั้นเรียนนั้นสามารถใช้อย่างสมเหตุสมผลได้หรือไม่?

10
เรียกใช้เมธอดคลาส C ++ ผ่านตัวชี้ฟังก์ชัน
ฉันจะรับฟังก์ชันพอยน์เตอร์สำหรับฟังก์ชันสมาชิกคลาสได้อย่างไรและในภายหลังเรียกฟังก์ชันสมาชิกนั้นด้วยอ็อบเจ็กต์เฉพาะ ฉันต้องการเขียน: class Dog : Animal { Dog (); void bark (); } … Dog* pDog = new Dog (); BarkFunction pBark = &Dog::bark; (*pBark) (pDog); … นอกจากนี้ถ้าเป็นไปได้ฉันต้องการเรียกใช้ตัวสร้างผ่านตัวชี้ด้วย: NewAnimalFunction pNew = &Dog::Dog; Animal* pAnimal = (*pNew)(); เป็นไปได้หรือไม่และถ้าเป็นเช่นนั้นวิธีใดที่ควรทำ

6
ฉันจะใช้ define_method เพื่อสร้างเมธอดคลาสได้อย่างไร
สิ่งนี้มีประโยชน์หากคุณพยายามสร้าง class method metaprogramatically: def self.create_methods(method_name) # To create instance methods: define_method method_name do ... end # To create class methods that refer to the args on create_methods: ??? end คำตอบของฉันที่จะติดตาม ...

3
เรียกใช้เมธอดคลาสของคลาสพื้นฐานใน Python
พิจารณารหัสต่อไปนี้: class Base(object): @classmethod def do(cls, a): print cls, a class Derived(Base): @classmethod def do(cls, a): print 'In derived!' # Base.do(cls, a) -- can't pass `cls` Base.do(a) if __name__ == '__main__': d = Derived() d.do('hello') > $ python play.py > In derived! > <class '__main__.Base'> msg จากDerived.doฉันจะโทรBase.doอย่างไร? โดยปกติฉันจะใช้superหรือแม้แต่ชื่อคลาสฐานโดยตรงหากนี่เป็นเมธอดอ็อบเจ็กต์ปกติ แต่ดูเหมือนว่าฉันไม่สามารถหาวิธีเรียกเมธอดคลาสในคลาสฐานได้ ในตัวอย่างข้างต้นBase.do(a)พิมพ์BaseคลาสแทนDerivedคลาส

3
ฉันควรใช้ @classmethod เมื่อใดและเมื่อใดที่วิธี def (self)?
ในขณะที่รวมแอพ Django ที่ฉันไม่เคยใช้มาก่อนฉันพบสองวิธีที่แตกต่างกันที่ใช้ในการกำหนดฟังก์ชันในคลาส ผู้เขียนดูเหมือนจะใช้ทั้งสองอย่างตั้งใจมาก คนแรกคือตัวฉันเองใช้บ่อยมาก: class Dummy(object): def some_function(self,*args,**kwargs): do something here self is the class instance อีกอันคืออันที่ฉันไม่ได้ใช้ส่วนใหญ่เป็นเพราะฉันไม่เข้าใจว่าจะใช้เมื่อใดและทำเพื่ออะไร: class Dummy(object): @classmethod def some_function(cls,*args,**kwargs): do something here cls refers to what? ในเอกสาร Python classmethodมัณฑนากรอธิบายด้วยประโยคนี้: เมธอดคลาสได้รับคลาสเป็นอาร์กิวเมนต์แรกโดยนัยเช่นเดียวกับที่วิธีอินสแตนซ์ได้รับอินสแตนซ์ ดังนั้นฉันเดาว่าclsหมายถึงDummyตัวมันเอง ( classไม่ใช่อินสแตนซ์) ฉันไม่เข้าใจว่าทำไมสิ่งนี้ถึงมีอยู่เพราะฉันสามารถทำได้เสมอ: type(self).do_something_with_the_class นี่เป็นเพียงเพื่อความชัดเจนหรือว่าฉันพลาดส่วนที่สำคัญที่สุด: สิ่งที่น่ากลัวและน่าสนใจที่ไม่สามารถทำได้หากไม่มีมัน?

4
อะไรคือความแตกต่างระหว่าง“ classmethod” และวิธี metaclass?
ใน Python ฉันสามารถสร้างวิธีการเรียนโดยใช้@classmethoddecorator: >>> class C: ... @classmethod ... def f(cls): ... print(f'f called with cls={cls}') ... >>> C.f() f called with cls=<class '__main__.C'> อีกวิธีหนึ่งฉันสามารถใช้วิธีปกติ (ตัวอย่าง) ใน metaclass: >>> class M(type): ... def f(cls): ... print(f'f called with cls={cls}') ... >>> class C(metaclass=M): ... pass ... >>> C.f() f called …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.