类的命名空间
举例说明
class person: language='Chinese'#这里定义一个静态属性 def __init__(self,name,age,sex,tall): self.name=name self.age = age self.sex = sex self.tall = tall # person.__dict__['language']='english'#不能通过这种方法来修改静态属性 person.language='english'#可以通过这种方法来修改,实现对静态属性的修改 print(person.language) JACK=person('jack',21,'man',180)#注意这里面除了单词以外,其余的数字都不用加引号 TOM=person('tom',21,'girl',150) print(JACK.tall) print(JACK.language)#也可以通过实例化以后的对象调用静态属性。这是因为实例化的对象一定对应的是这个类,也就是一种特殊的类,所以能够实现利用实例化对象调用静态属性
对静态属性的修改
class person: language='Chinese'#这里定义一个静态属性 def __init__(self,name,age,sex,tall): self.name=name self.age = age self.sex = sex self.tall = tall # person.__dict__['language']='english'#不能通过这种方法来修改静态属性 person.language='english'#可以通过这种方法来修改,实现对静态属性的修改 JACK=person('jack',21,'man',180) TOM=person('tom',21,'girl',150) #对静态属性的修改 JACK.language='Chinese' print(JACK.language)#这里的结果是'Chinese',说明只修改了,JACK的language的属性,而没有修改整个person类的属性。这个很好理解,因为JACK只是person整个大类的实例化对象,那么如果修改JACK的静态属性,自然不会引起整个person属性的变化 print(person.language)
如果要删除利用实例化对象对静态属性的修改,则可以
class person: language='Chinese'#这里定义一个静态属性 def __init__(self,name,age,sex,tall): self.name=name self.age = age self.sex = sex self.tall = tall # person.__dict__['language']='english'#不能通过这种方法来修改静态属性 person.language='english'#可以通过这种方法来修改,实现对静态属性的修改 JACK=person('jack',21,'man',180) TOM=person('tom',21,'girl',150) #对静态属性的修改 JACK.language='Chinese' print(JACK.language)#这里的结果是'Chinese',说明只修改了,JACK的language的属性,而没有修改整个person类的属性。这个很好理解,因为JACK只是person整个大类的实例化对象,那么如果修改JACK的静态属性,自然不会引起整个person属性的变化 #如果要删除这个修改可以: del JACK.language print(person.language)
通过以上示例可以说明,类中的静态变量,可以被对象和类调用;
对于不可变数据类型而言,类变量最好用类操作。
继续深入讨论:
当静态属性以列表的形式出现
class person: language=['Chinese']#这里定义一个静态属性 def __init__(self,name,age,sex,tall): self.name=name self.age = age self.sex = sex self.tall = tall JACK=person('jack',21,'man',180) TOM=person('tom',21,'girl',150) #对静态属性的修改 JACK.language[0]='English' print(JACK.language) print(person.language) D:\anoconda\python.exe F:/python/python学习/人工智能/第一阶段day2/145.py ['English'] ['English'] Process finished with exit code 0
如上代码所示,当静态属性变为列表后,由于列表本身是一个可变数据类型,那么当实例化对象对静态属性进行修改后,实际上修改是列表中的内容,但是整个类对应的依然是这个列表的形式,所以当里面的内容被修改后,类对应的列表形式虽然没有修改。但是实际上列表中的内容被修改。也会引起整个类对应静态属性的变化。
对比
class person: language=['Chinese']#这里定义一个静态属性 def __init__(self,name,age,sex,tall): self.name=name self.age = age self.sex = sex self.tall = tall JACK=person('jack',21,'man',180) TOM=person('tom',21,'girl',150) #对静态属性的修改 JACK.language=['English'] print(JACK.language) print(person.language) D:\anoconda\python.exe F:/python/python学习/人工智能/第一阶段day2/145.py ['English'] ['Chinese'] Process finished with exit code 0
上面的这段代码,不是修改内容,而是修改的列表的形式,所以在运行结果后,显示出只有实例化对象结果改变,而类的结果不变。这是因为类只是判断的是列表的形式而非里面的内容。
够建一段代码:实现没执行一次实例化,都计数一次
class foo: count=0 def __init__(self): foo.count+=1 f1=foo() f2=foo() print(f1.count) print(f2.count) f3=foo() print(f1.count)
绑定方法:
当一个对象名调用类中的方法时,这个方法就和这个对象绑定在一起了,也就是说这个对象能够以self的形式传递到这个方法里面。
class foo: def func(self):#注意这里没有__init__就表示没有对self进行初始化,也就没有赋值这一步,也就是说self这个字典为空 print('func') f1=foo() print(foo.func) print(f1.func)#绑定方法,可以看作是将f1传递给了func,可以理解为将f1和func方法绑定在了一起。 print(f1)
导入一个包的过程就像是一个实例化的过程
import time,这就是一个实例化的过程。
比如time.time(),就好像一个对象去访问它的属性