在__init__内部,使用__init__外部的å˜é‡

时间:2019-01-19 15:59:33

标签: python class object

阅读this的答案åŽï¼Œæˆ‘了解到__init__之外的å˜é‡ç”±è¯¥ç±»çš„所有实例共享,并且__init__内的å˜é‡å¯¹äºŽæ¯ä¸ªå®žä¾‹éƒ½æ˜¯å”¯ä¸€çš„。

我想使用所有实例共享的å˜é‡ï¼Œä¸ºæˆ‘的类实例éšæœºåˆ†é…一个唯一的å‚数。这是我å°è¯•è¿‡çš„简短版本;

from random import choice

class Chromosome(object):
    variable1 = [x for x in range(1,51)]
    variable2 = [x for x in range(51,101)]

    def __init__(self):
        self.var1 = choice(variable1)
        self.var2 = choice(variable2)

我的问题是,åˆå§‹åŒ–新实例时无法到达实例å˜é‡ï¼Œé”™è¯¯æ¶ˆæ¯ä¸ºname "variable1" is not defined,是å¦æœ‰è§£å†³æ–¹æ³•ï¼Ÿ

编辑:我想在__init__之外创建列表的原因是为了节çœå†…存,如果我创建10.000个染色体,æ¯ä¸ªæŸ“色体具有大约10-15个å˜é‡ï¼Œé‚£ä¹ˆæœ€å¥½åªåˆ›å»ºä¸€æ¬¡åˆ—表,而ä¸æ˜¯ä¸ºæ¯ä¸ªæŸ“色体都创建它们。

EDIT2:如果有人想使用它,我的最终解决方案就是使用random.randrange(a,b+1,2)。这样会选择[a,b]范围内的éšæœºæ•°ï¼ˆä»…包括å¶æ•°ï¼‰ï¼ŒåŒ…括边界。

3 个答案:

答案 0 :(得分:4)

您åªéœ€è¦åœ¨å¼•ç”¨ç±»å称时使用它å³å¯ã€‚对Python说variable1会使它从范围中找到一个å˜é‡ã€‚但是,您的å˜é‡æ˜¯ç±»çš„属性。

from random import choice

class Chromosome(object):
    variable1 = [x for x in range(1,51)]
    variable2 = [x for x in range(51,101)]

    def __init__(self):
        self.var1 = choice(Chromosome.variable1)
        self.var2 = choice(Chromosome.variable2)

åŒæ ·ï¼Œæ‚¨å¯ä»¥ä½¿ç”¨self.variable1,因为它åªæ˜¯ç±»çš„实例,并且也å¯ä»¥è®¿é—®ç±»å±žæ€§ã€‚

这里的主è¦æ€æƒ³æ˜¯ï¼Œå½“您访问类的任何属性或方法时,必须æ供一个å¯ä»¥è®¿é—®è¿™äº›æ–¹æ³•çš„对象,无论是类,å­ç±»è¿˜æ˜¯å…¶ä¸­ä»»ä½•ä¸€ä¸ªçš„实例。您ä¸ä¼šå°†dict.from_keys()称为from_keys(),对å—?

答案 1 :(得分:3)

您也å¯ä»¥åªä½¿ç”¨self而ä¸æ˜¯Chromosome。我猜也ä¸éœ€è¦object。

from random import choice

class Chromosome():
    variable1 = [x for x in range(1,51)]
    variable2 = [x for x in range(51,101)]

    def __init__(self):
        self.var1 = choice(self.variable1)
        self.var2 = choice(self.variable2)

答案 2 :(得分:0)

这是å¦ä¸€ç§æ–¹å¼ï¼šï¼ˆä»¥ä¸Šç­”案都是正确的)

import random

class Chromosome(object):
    def __init__(self):
        self.var1 = random.choice([x for x in range(1, 51)])
        self.var2 = random.choice([x for x in range(51, 101)])