类中的Python全局变量?

类中的Python全局变量?,python,class,variables,global,Python,Class,Variables,Global,我有一个我的商务类实例列表。我习惯于在类的顶部为类定义变量。在业务类中的一个变量上是标记列表。当我循环浏览企业列表时,有些有标签,有些没有。在20家企业中,列表中的第4个元素有4个标记。将这些标记添加到此业务后,所有以下业务实例也共享这些标记。这是我的商务舱- from tag import * class Business: name = "" website = "" phone = "" address = "" city = "" sta

我有一个我的商务类实例列表。我习惯于在类的顶部为类定义变量。在业务类中的一个变量上是标记列表。当我循环浏览企业列表时,有些有标签,有些没有。在20家企业中,列表中的第4个元素有4个标记。将这些标记添加到此业务后,所有以下业务实例也共享这些标记。这是我的商务舱-

from tag import *

class Business:
    name = ""
    website = ""
    phone = ""
    address = ""
    city = ""
    state = ""
    postalCode = ""
    tags = []
    data = {}

    def __init__(self, name):
        self.setName(name)

    # Modifiers

    def setName(self, name):
        self.name = name

    def setWebsite(self, website):
        self.website = website

    def setPhone(self, phone):
        self.phone = phone

    def addTag(self, Tag):
        self.tags.append(Tag)

    def setAddress(self, address):
        self.address = address

    def setCity(self, city):
        self.city = city

    def setState(self, state):
        self.state = state

    def setPostalCode(self, postalCode):
        self.postalCode = postalCode

    def set(self, key, value):
        self.data[key] = value

    def unset(self, key):
        del self.data[key]

    # Accessors

    def getWebsite(self):
        return self.website

    def getName(self):
        return self.name

    def getPhone(self):
        return self.phone

    def getTags(self):
        return self.tags

    def getAddress(self):
        return self.address

    def getCity(self):
        return self.city

    def getState(self):
        return self.state

    def getPostalCode(self):
        return self.postalCode

    def get(self, key):
        return self.data[key]

    def getKeys(self):
        return self.data.keys()

    # Helpers
一个标签被添加到这样的业务中-

if len(categories) > 1:
    for cat in categories:
        B.addTag(Tag(cat))

在我的业务类顶部定义的变量是否对所有业务实例都是全局的?如何解决此问题?

是的,以这种方式分配的可变项对类来说是“全局的”。要使它们“本地”,请将它们定义为实例变量。例如,要对标记执行此操作,请删除现有的全局定义,并在_init__;中添加一行,如:

def __init__(self, name):
    self.setName(name)
    self.tags = []

这会将标记的值分配给self而不是类。

您应该这样做:

from tag import *

class Business:
    def __init__(self, name, website='', phone='', address='', city='', state='', postal_code='', tags=None, data=None):
        self.name        = name
        self.website     = website
        self.phone       = phone
        self.address     = address
        self.city        = city
        self.state       = state
        self.postal_code = postal_code

        self.tags        = []
        if tags is not None:
            for tag in tags:
                self.add_tag(tag)

        self.data        = {} if data is None else data

    def add_tag(self, tag):
        if not isinstance(tag, Tag):
            tag = Tag(tag)
        self.tags.append(tag)

    def add_data(self, key, value):
        self.data[key] = value

    def remove_data(self, key):
        del self.data[key]

    def get_data(self, key):
        return self.data[key]

    def get_data_keys(self):
        return self.data.keys()

Python通常避免使用getter和setter,除非需要一些额外的处理或错误检查

这是一个非常常见的问题。请参阅以获得解释。或者,是另一个。这一个:好的,这是有效的。但是什么不使用get和setter方法呢?添加这个抽象层不是一个好习惯吗?