2012-04-23 3 views
1

Lorsque j'écris une classe en python, la plupart du temps, j'ai hâte de définir les variables que j'utilise, en tant que propriétés de l'objet. Existe-t-il des règles ou des directives générales sur les variables qui devraient être utilisées en tant qu'attribut de classe/instance et lesquelles ne devraient pas l'être?Classes en python, comment définir un attribut

par exemple:

class simple(object): 
    def __init(self): 
     a=2 
     b=3 
     return a*b 

class simple(object): 
    def __init(self): 
     self.a=2 
     self.b=3 
     return a*b 

Bien que je comprenne complètement les attributs doivent être une propriété de l'objet. C'est simple à comprendre quand la déclaration de classe est simple mais comme le programme va de plus en plus longtemps et qu'il y a beaucoup d'endroits où l'échange de données entre les différents modules doit être fait, je deviens confus où je devrais utiliser a/b ou self.a /self.b. Y a-t-il des directives pour cela?

+1

Les «__init» ne devraient-ils pas être «__init__»? – ricochet1k

+1

Une règle de base que j'aime vraiment est: Utilisez la plus petite portée que vous pouvez obtenir avec. Les variables locales ont une portée beaucoup plus petite que les attributs, donc si vous n'avez pas de cas d'utilisation convaincant, c'est un attribut ... – delnan

+0

@delnan: belle suggestion –

Répondre

5

Lorsque vous utilisez self.a, vous créez une propriété, vous pouvez donc y accéder depuis l'extérieur de la classe et persister au-delà de cette fonction. Ceux-ci devraient être utilisés pour stocker des données sur l'objet. Lorsque vous utilisez a, il s'agit d'une variable locale, qui ne dure que dans le cadre de cette fonction. Vous devez donc l'utiliser lorsque vous l'utilisez uniquement dans la fonction (comme dans ce cas).

Notez que __init est trompeur, car il ressemble à __init__ - mais n'est pas le constructeur. Si vous vouliez qu'ils soient le constructeur, cela n'a aucun sens de renvoyer une valeur (car le nouvel objet est ce qui est retourné).

+0

__init__Typo ... Ma question existe toujours. J'ai du mal à me décider quand créer/ne pas créer de propriété. Je pense parfois que la même chose peut être utilisée en dehors de la classe et tend à l'utiliser. Je n'ai pas une sorte de décision pour déterminer s'il faut l'utiliser comme self.a ou a. C'est mon problème. –

+0

@Jack_of_All_Trades Comme je l'ai dit dans ma question, c'est à peu près le cas, est-ce seulement pertinent en interne? Si oui, utilisez une variable locale, sinon, faites-en un attribut. Essayez d'utiliser la plus petite portée possible pour garder votre code propre, et rappelez-vous que vous pouvez toujours revenir en arrière et le changer, ce n'est pas une grosse affaire. –

1

J'essaie d'imaginer ce que je veux que l'API de ma classe ressemble avant de l'implémenter. Je pense à moi-même, Si je n'ai pas écrit ce cours, voudrais-je lire la documentation sur ce que fait cette variable particulière? Si la lecture de cette documentation me ferait perdre mon temps, elle devrait probablement être une variable locale. De temps en temps, vous devez conserver certaines informations, mais vous ne voulez pas nécessairement que cela fasse partie de l'API, c'est-à-dire lorsque vous utilisez la convention d'ajout d'un trait de soulignement. par exemple. self._some_data_that_is_not_part_of_the_api.

1

Le paramètre auto fait référence à l'objet lui-même. Donc, si vous avez besoin d'utiliser un des attributs de la classe en dehors de la classe, vous l'appellerez le nom de l'instance de la classe et le nom de l'attribut. Je ne pense pas qu'il existe de lignes directrices sur le moment de l'utilisation de soi, tout dépend de votre besoin. Lorsque vous construisez un cours, vous devriez essayer de penser à ce que vous utiliserez pour les variables que vous créez. Si vous savez avec certitude que vous aurez besoin de cet attribut spécifique dans le programme que vous importez votre classe, alors ajoutez-le.

1
class Person(object): 
    def __init__(self, name): 
     # Introduce all instance variables on __init__ 
     self.name = name 
     self.another = None 

    def get_name(self): 
     # get_name has access to the `instance` variable 'name' 
     return self.name 

Donc, si vous voulez une variable soit disponible sur plus d'une méthode, faire il une variable instance.

Remarquez mon commentaire sur l'introduction de toutes les variables d'instance sur __init__. Bien que l'exemple ci-dessous soit valide, python ne le fait pas.

class Person(object): 
    def __init__(self): 
     self.a = 0 
    def foo(self): 
     self.b = 1 # Whoa, introduced new instance variable 

initialize lieu toutes vos variables d'instance sur __init__ et les mis à None si aucune autre valeur est appropriée pour eux.

Questions connexes