écrire une sous-classe de c'est génial, mais j'aimerais aussi créer Mon expérience avec MATLAB a été jusqu'à présent, qu'une fois que je crée une instance d'une classe, l'ajout de nouvelles méthodes n'est pas possible. C'est très encombrant, car mon objet peut contenir de nombreuses données, que je devrai re-charger à chaque fois que je souhaite ajouter une nouvelle méthode (car je dois faire Voilà donc un moyen d'ajouter des méthodes à la volée? P> P> dynamicprops code> permet d'ajouter des propriétés de manière dynamique à un objet: Définissez / obtenez CODE> Fonctions pour ces propriétés à la volée. Ou des fonctions d'analyse qui fonctionnent sur ces propriétés dynamiques. P> classes claires code>) . p>
3 Réponses :
Vous ne pouvez pas ajouter des méthodes telles que vous ajoutez des propriétés dynamiques. Cependant, il existe deux manières de mettre en œuvre de nouvelles méthodes au cours du développement qui ne vous obligeront pas à ré-charger les données à chaque fois.
(1) J'écris des méthodes standard comme des fonctions distinctes et les appelez comme (2) avec des méthodes définies / get, les choses sont un peu plus difficiles. Si vous utilisez (2.1) Voici un exemple de comment créer une propriété cachée pour Stocker et récupérer des résultats (basé sur JMLOPEZ 'Réponse ). De toute évidence, cela peut être beaucoup amélioré si vous avez une meilleure idée de ce que vous concevez réellement p> myMethod ( obj) code> pendant le développement. Une fois que je suis sûr qu'ils sont stables, j'ajoute sa signature dans le fichier de définition de la classe - cela nécessite un classes transparents code>, bien sûr, mais c'est un très retardé, et de temps en temps vous Peut-être avoir à éteindre Matlab, de toute façon. p> dynamicprops code> pour ajouter de nouvelles propriétés, vous pouvez également spécifier leurs méthodes de définition / get, cependant (probablement ces méthodes / fonctions voudront recevoir le nom de la propriété afin qu'ils sachent quoi se référer à): p>
donc myMethod code> sera en fait une fonction générique (et non une méthode de classe) que vous pouvez modifier à votre guise, non?
@MemSelf: Exactement. Ensuite, vous pouvez copier MyMethod code> dans le fichier CLASSDEF ou simplement ajouter la signature au fichier ClassDef et déplacer myMethod code> dans le dossier de la classe.
@Jonas, est-il possible de savoir quel établissement nous essayons de changer de YourcustMetThod code>? Dans l'exemple que vous avez fourni, nous pouvons avoir quelque chose comme obj.new_prop = val; code> pour définir la valeur. Pouvons-nous accéder au nom de la propriété en quelque sorte?
@JMLOPEZ: Vous avez raison, bien sûr. Vous devez probablement transmettre explicitement le nom de la propriété sur la méthode.
Nice édition. Je suis un peu confus à propos de cette notation cependant: @ (obj, val) mydynamicclass.setmethod (obj, val, clé) code>. Cela signifie-t-il que je peux faire quelque chose comme: @ (obj, val) setmethod (obj, val, arg1, arg2, arg3, ...) code>? Qu'est-ce que ça veut dire? Est-ce une sorte de casting de fonction?
@JMLOPEZ: @ (obj, val) est une fonction anonyme qui appelle code> setMethod` avec les arguments obj, val code>. Lors de la construction, arg1 code> etc. est défini dans l'espace de travail actuel et sera transmis à SETMETOD CODE> une fois qu'elle est appelée.
J'ajoute cette réponse parce que je pense que cela n'est pas intuitif. Au moins pas pour moi en ce moment. Après avoir trouvé cette question, j'ai pensé que j'avais eu ce que je devais pouvoir définir les méthodes Set / Obtenir de ma classe dynamique. Tout ce que je voulais réaliser avec c'était quelque chose de similaire à ce que Python fait avec son __ setattr __ code>. En tout cas, voici un suite de la classe faite par @jonas il y a un moment avec quelques modifications pour ajouter la Notre Méthode de jeu personnalisé. >> p_int = myDynamicClass('Point', 'x', @int8, 'y', @int32);
>> p_int.x = 1000
p_int =
myDynamicClass with properties:
y: []
x: 127
>> class(p_int.x)
ans =
int8
C'est correct. Notez que lors de la définition des méthodes de jeu / get personnalisé, vous pouvez rencontrer le risque de récursions infinies, car l'analyseur MATLAB ne saura pas toujours éviter d'appeler la méthode définie lorsque vous attribuez la valeur de la propriété. Pour rendre votre vie plus facile (aussi à des fins de débogage), il peut être utile d'avoir une propriété cachée pour stocker les valeurs, qui est ensuite accessible par les méthodes Getter / Setter.
@Jonas Super commentaire - Pourriez-vous élaborer un peu plus sur la propriété cachée et comment implémenter cela?
@Jonas, tellement similaire à Python __ dict __ code> variable. Ils mentionnent la possibilité d'une récursion infinie ici . Existe-t-il une documentation sur Matlab qui explique comment faire cela?
@MEMOsons, JMLOPEZ: J'ai mis à jour ma réponse avec un exemple.
Mon expérience avec Matlab a été jusqu'à présent, qu'une fois que je crée une instance d'une classe, l'ajout de nouvelles méthodes n'est pas possible. C'est très encombrant, car mon objet peut contenir de nombreuses données, que je devrai redéfinir chaque fois que je souhaite ajouter une nouvelle méthode (car je dois faire
classes claires code>). p>Il convient de noter les lecteurs actuels de cette question que ce n'est plus vrai. AS de MATLAB R2014B Matlab met à jour les définitions de la classe à la moment où vous les enregistrez et le comportement des instances de classe existantes Mises à jour automatiquement en conséquence . Dans le cas de l'ajout de nouvelles méthodes, il est simple: la nouvelle méthode devient simplement disponible pour appeler des instances de classe même si elles ont été créées avant que la méthode ait été ajoutée à la classe. P>
Les solutions données pour choisir le jeu / Obtenir des méthodes pour les propriétés dynamiques s'applique toujours. P>
Il existe des cas encore où vous voudrez peut-être ajouter des méthodes à une instance de manière dynamique et la méthode ne constitue pas une méthode de la propriété / GET. Je pense que la seule réponse dans ce cas est d'attribuer une fonction de fonction comme valeur à une propriété dynamique. Cela ne crée pas une méthode de bonne foi, mais vous permettra de l'appeler de la même manière que vous seriez une méthode appelant: p>
xxx pré> appels à
obj.new_method (args) code> sont donc passés àmy_method code>; Cependant, cela ne fonctionne que avec un scalaireobj code>; Un éventail d'instances aura des valeurs distinctes pour la propriétéNew_Method CODE> SOobj.new_method code> ne résout plus à une seule fonction de fonction pouvant être appelée siobj code > est un tableau. P> blockQuote>
Vous pouvez ajouter de nouvelles méthodes aussi longtemps que vous faites des classes claires, mais vous voulez vous en contenter. Je ne pense pas que cela fonctionnera en général.