【python基础】类属性和实例属性

在前面的例子中我们接触到的就是实例属性(对象属性),顾名思义,类属性就是类对象所拥有的属性,它被所有类对象实例对象所共有,在内存中只存在一个副本,这个和C++中类的静态成员变量有点类似。对于公有的类属性,在类外可以通过类对象实例对象访问

类属性(访问、修改、添加、删除)

class People(object):
    name = 'Tom'  #公有的类属性
    __age = 12     #私有的类属性

p = People()

###1 访问
print(p.name)           #正确
print(People.name)      #正确
#print(p.__age)            #错误,不能在类外通过实例对象访问私有的类属性
#print(People.__age)        #错误,不能在类外通过类对象访问私有的类属性


###2 添加(类对象和实例对象)
People.weigt = 140
print(People.weigt)
p.address = "上海"
print(p.address)


#3 直接修改类属性
People.name = "Jay"

print(p.name)           #正确
print(People.name)      #正确


##4 删除类属性
del People.weigt
#print(People.weigt) ##已经删除


Tom
Tom
140
上海
Jay
Jay

注意:

  • 不能在类外通过实例对象访问私有的类属性,也不能通过类对象访问私有的类属性。
  • 可直接对类属性和实例属性进行修改、增加、删除,实际应用中要注意影响。

实例属性(对象属性)

class People(object):
    address = '山东' #类属性
    def __init__(self):
        self.name = 'xiaowang' #实例属性
        self.age = 20 #实例属性
        self.__phone= 1388888888  #私有属性

p = People()
#1 修改实例属性
p.age =12 #修改实例属性

## 2 访问实例属性
print(p.address) #正确
print(p.name)    #正确
print(p.age)     #正确
#print(p.__phone) #错误,不能在类外通过实例对象访问私有属性
print(People.address) #正确
#print(People.name)    #错误,不能在类外通过类对象访问实例属性
#print(People.age)     #错误,不能在类外通过类对象访问实例属性

#3 添加属性
People.time = 2000
p.phone = 13888888
print(p.phone)
print(People.time)
print(p.time)

#4 删除
#del p.time    #这个时候无法删除
del People.time


山东
xiaowang
12
山东
13888888
2000
2000

注意:

  • 不能在类外通过实例对象访问私有的实例属性;
  • 不能在类外通过类对象访问实例属性;
  • 可直接对类属性和实例属性进行修改、增加、删除,实际应用中要注意影响。

通过实例(对象)去修改类属性

class  People(object):
    country = "china"

#打印类属性
print(People.country)
#创建实例对象
p=People()
t=People()
#打印实例对象属性
print(p.country)
#修改实例对象属性
p.country = "Amarica"
print(p.country)
print(People.country)
#删除实例属性
del p.country
print(p.country)
print(People.country)

#测试修改类属性
print(t.country)
People.country = "rusa"
#类属性修改后影响了实例属性
print(t.country)
china
china
Amarica
china
china
china
china
rusa

总结

  • 如果需要在类外修改类属性,必须通过类对象去引用然后进行修改。如果通过实例对象去引用,会产生一个同名的实例属性,这种方式修改的是实例属性,不会影响到类属性,并且之后如果通过实例对象去引用该名称的属性,实例属性会强制屏蔽掉类属性,即引用的是实例属性,除非删除了该实例属性

实例属性(实例对象拥有的属性)

类属性

只有实例自己可以使用

可以通过类和实例来访问

实例对象不可以直接修改类属性,只是在实例对象中创建了一个与类属性同名的实例属性,如需修改需要调用类方法来修改。

可以直接通过类修改类属性(C.value +=1)

公有的类属性修改后,实例对象里面公用的类属性也会被修改。

 

猜你喜欢

转载自blog.csdn.net/weixin_40283570/article/details/82630159