Python中的类变量、实例变量、局部变量

Python024

Python中的类变量、实例变量、局部变量,第1张

类体内,所有函数外定义。

所有实例对象共享。

只有通过类名调用时才能修改,通过实例调用时无法修改。

假设某类变量名为“name",如果用该类的某个实例x来为name赋值:x.name = 'xxx',实质是为该实例新定义了一个变量name。且之后无法再通过该实例调用类变量name了。因为使用实例调用某名为“xxx”变量时,若该实例没有名为“xxx”的实例变量,则会去调用名为“xxx”的类变量;若有该名称的实例变量,则该实例无法再直接调用该名称对应的类变量。因此也不推荐通过实例来调用类变量。

即:通过类实例修改类变量的值时,实际是在定义新的与类变量同名的实例变量。

类体内,某函数(一般是__ init __ ())内定义。 “self.变量名”

因为是属于某个具体实例的,因此不能通过类名访问。

如果不在__ init __ () 中调用(该函数会在创建实例时自动调用一次),则只有调用该实例中定义目标实例变量的那个函数后,才能使用目标实例变量。因此最好在__ init __ () 中定义实例变量。

类体内,某函数内定义。

直接在函数内用“变量名=值”的方式进行定义。

函数执行完毕后,该局部变量即被销毁。

9.3.5. 类和实例变量

一般来说,实例变量用于对每一个实例都是唯一的数据,类变量用于类的所有实例共享的属性和方法:

class Dog:

kind = 'canine' # class variable shared by all instances

def __init__(self, name):

self.name = name# instance variable unique to each instance

>>>d = Dog('Fido')

>>>e = Dog('Buddy')

>>>d.kind # shared by all dogs

'canine'

>>>e.kind # shared by all dogs

'canine'

>>>d.name # unique to d

'Fido'

>>>e.name # unique to e

'Buddy'

正如在 术语相关 讨论的, 可变 对象,例如列表和字典,的共享数据可能带来意外的效果。例如,下面代码中的 tricks 列表不应该用作类变量,因为所有的 Dog 实例将共享同一个列表:

class Dog:

tricks = [] # mistaken use of a class variable

def __init__(self, name):

self.name = name

def add_trick(self, trick):

self.tricks.append(trick)

>>>d = Dog('Fido')

>>>e = Dog('Buddy')

>>>d.add_trick('roll over')

>>>e.add_trick('play dead')

>>>d.tricks# unexpectedly shared by all dogs

['roll over', 'play dead']

这个类的正确设计应该使用一个实例变量:

class Dog:

def __init__(self, name):

self.name = name

self.tricks = []# creates a new empty list for each dog

def add_trick(self, trick):

self.tricks.append(trick)

>>>d = Dog('Fido')

>>>e = Dog('Buddy')

>>>d.add_trick('roll over')

>>>e.add_trick('play dead')

>>>d.tricks

['roll over']

>>>e.tricks

['play dead']

总结后的知识点希望能帮到你