类的命名空间

举例说明

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(),就好像一个对象去访问它的属性

posted @ 2019-03-05 21:54  舒畅123  阅读(154)  评论(0编辑  收藏  举报