Δεν θα έπρεπε __metaclass__ αναγκάσει τη χρήση μιας μετακλάση στην Python;

ψήφοι
6

Έχω προσπαθήσει να μάθουν για μετακλάσεις στην Python. Παίρνω τη βασική ιδέα, αλλά δεν μπορώ να φαίνεται για να ενεργοποιηθεί ο μηχανισμός. Όπως το αντιλαμβάνομαι, μπορείτε να καθορίσετε το Μ να είναι όσο το μετακλάση κατά την κατασκευή μιας κατηγορίας K θέτοντας __metaclass__σε Μ σε παγκόσμιο ή κατηγορίας επίπεδο. Για να το δοκιμάσετε, έγραψα το παρακάτω πρόγραμμα:

p = print

class M(type):
    def __init__(*args):
        type.__init__(*args)
        print(The rain in Spain)

p(1)
class ClassMeta:
    __metaclass__ = M

p(2)
__metaclass__ = M
class GlobalMeta: pass

p(3)
M('NotMeta2', (), {})

p(4)

Ωστόσο, όταν το τρέξετε, να πάρω το ακόλουθο αποτέλεσμα:

C: \ Documents and Settings \ Daniel Wong \ Desktop> python --version
Python 3.0.1

C: \ Documents and Settings \ Daniel Wong \ Desktop> python meta.py
1
2
3
Η βροχή στην Ισπανία
4

Σε περίπτωση που δεν βλέπω «Η βροχή στην Ισπανία» μετά από 1 και 2; Τι συμβαίνει εδώ?

Δημοσιεύθηκε 04/05/2009 στις 00:18
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
13

Στην Python 3 (που χρησιμοποιείτε) είναι μετακλάσεις καθορίζεται από μια λέξη-κλειδί παραμέτρου στον ορισμό της κατηγορίας:

class ClassMeta(metaclass=M):
  pass

Καθορισμός ενός __metaclass__ακινήτου τάξη ή global μεταβλητή είναι παλιά σύνταξη από την Python 2.x και δεν υποστηρίζεται πλέον. Δείτε επίσης «Τι νέο υπάρχει στο Python 3» και PEP 2115 .

Απαντήθηκε 04/05/2009 στις 00:29
πηγή χρήστη

ψήφοι
2

Αυτό λειτουργεί όπως θα περίμενε κανείς σε Python 2.6 (και νωρίτερα), αλλά σε 3.0 μετακλάσεις ορίζεται διαφορετικά:

class ArgMeta(metaclass=M): ...
Απαντήθηκε 04/05/2009 στις 00:33
πηγή χρήστη

ψήφοι
2

Η σύνταξη της μετακλάσεις έχει αλλάξει στην Python 3.0. Το __metaclass__χαρακτηριστικό αυτό δεν είναι πλέον ειδική είτε της κατηγορίας, ούτε το επίπεδο λειτουργικής μονάδας. Για να το κάνετε αυτό που προσπαθούμε να κάνουμε, πρέπει να καθορίσετε metaclassως λέξη-κλειδί επιχείρημα για τη classδήλωση:

p = print

class M(type):
    def __init__(*args):
        type.__init__(*args)
        print("The rain in Spain")

p(1)
class ClassMeta(metaclass=M): pass

αποδόσεις:

1
The rain in Spain

Όπως θα περιμένατε.

Απαντήθηκε 04/05/2009 στις 00:37
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more