day6-类的公有属性

概述

前面我们讲了类的私有属性,现在我们来说说类的公有属性,这边很容易被人弄混淆,有人认为,在__init__()构造方法中,除了私有属性,其他的都是公有属性了,其实这是一个错误的结论,并不是定义在__init__()初始化方法中的属性是公有属性(除私有属性),那什么是公有属性呢?

定义:指的是所属这个类的所有对象,都可以访问的属性,叫做公有属性。

公有属性

1.定义公有属性

class Role(object):
    nationality = 'Janpan'  # 在类里直接定义的属性即是公有属性

    def __init__(self, name,life_value=100, money=15000):
        self.name = name

d1 = Role("Dick")
d2 = Role("Jacky")
print(d1.nationality, d2.nationality)  # 所有的成员变量都可以访问
 
#输出
Janpan Janpan

那么这里有个疑问,d1.name,d2.name也可以访问,也可以修改, 为什么不能叫公有属性呢?接着下面的例子:

class Role(object):
    nationality = 'Janpan'  # 在类里直接定义的属性即是公有属性

    def __init__(self, name,life_value=100, money=15000):
        self.name = name

    def buy_gun(self, gun_name):
        print("just bought %s" % gun_name)

d1 = Role("Dick")
d2 = Role("Jacky")
print(d1.name, d2.name)  # 所有的成员变量都可以访问

#输出
Dick Jacky

由此结果可以看出,name是每个对象的属性,并不是共享,而是独立的 。

2.类访问公有属性

class Role(object):
    nationality = 'Janpan'  #在类里直接定义的属性即是公有属性

    def __init__(self, name, role, weapon, life_value=100, money=15000):
        self.name = name
        self.role = role
        self.weapon = weapon
        self.life_value = life_value
        self.money = money

r1 = Role('dick', 'police', 'AK47') #生成一个角色
r2 = Role('Jacky', 'terrorist', 'B22')  #生成一个角色

print(r1.nationality)  #访问公有属性
Role.nationality = "CN" #修改公有属性 (r1,r2都改了)
print(r2.nationality)  
#输出
Janpan
CN

3.公有属性特性

class Role(object):
    nationality = 'Janpan'  #在类里直接定义的属性即是公有属性

    def __init__(self, name, role, weapon, life_value=100, money=15000):
        self.name = name
        self.role = role
        self.weapon = weapon
        self.life_value = life_value
        self.money = money

    def shot(self):
        print("shooting...")

    def got_shot(self):
        print("ah...,I got shot...")

    def buy_gun(self, gun_name):
        print("just bought %s" % gun_name)
        self.weapon = gun_name

r1 = Role('dick', 'police', 'AK47')   #生成一个角色
r2 = Role('Jacky', 'terrorist', 'B22')  #生成一个角色

print("======before=change====")
print(r1.nationality)
print(r2.nationality)
print("====1==after=change====")
r1.nationality = "SIW"
print(r1.nationality)   
print(r2.nationality)
print("====2==after=change====")
Role.nationality = "CN"   #更改类的公有属性 (r1,r2都改了)
print(r1.nationality)
print(r2.nationality)

#输出
======before=change====
Janpan
Janpan
====1==after=change====
SIW       #r1对象的公共属性被修改了,实例属性会屏蔽掉同名的类属性
Janpan
====2==after=change====
SIW       #r1对象的公共属性值没有随着类本身的公共属性值修改而修改
CN

小结:

  • 对象r1去访问nationality属性时,如果在成员属性中找不到,就会找公共属性,也就是说自己的属性找不到就去找父亲的属性
  • r1.nationality="SIW" 相当于在自己对象内部又重新创建了一个新的局部变量,这个局部变量已经脱离了class本身,跟这个类已经没有关系了,只是名字一样而已,如果不改,还是找全局的。
posted @ 2017-08-02 23:48  Mr.hu  阅读(147)  评论(0编辑  收藏  举报