设为首页 收藏本站
查看: 870|回复: 0

[经验分享] python实例属性和类属性精讲

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-3-15 09:13:45 | 显示全部楼层 |阅读模式
一:访问与改变

# -*-coding: UTF-8 -*-
class ShuXing(object):
    class_shuxing = "class_shuxing"
    class_shuxing_list = [1, 2, 3]
    def __init__(self):
        self.instance_shuxing = "instance_shuxing"
        self.instance_shuxing_list = [5, 6, 7]

print ShuXing.class_shuxing
print ShuXing.class_shuxing_list
#print ShuXing.instance_shuxing   类名不能访问instance不可变变量
#print ShuXing.instance_shuxing_list  类名不能访问instance可变变量
a = ShuXing()
#instance可以访问任何变量
print a.class_shuxing
print a.class_shuxing_list
print a.instance_shuxing
print a.instance_shuxing_list
print "+++++++++++++++++++"
print "instance gaipian class"
a.class_shuxing = "gaipian class_shuxing"
a.class_shuxing_list.append("gaipian class_shuxing_list")

print ShuXing.class_shuxing  #类不可变变量没改变
print ShuXing.class_shuxing_list  #类可变变量有改变
#print ShuXing.instance_shuxing
#print ShuXing.instance_shuxing_list
a = ShuXing()
print a.class_shuxing
print a.class_shuxing_list   #类可变变量有改变
print a.instance_shuxing
print a.instance_shuxing_list

print "+++++++++++++++++++"
print "class gaipian class"
ShuXing.class_shuxing = "gaipian class_shuxing"
ShuXing.class_shuxing_list.append("gaipian class_shuxing_list")

print ShuXing.class_shuxing   #类不可变变量有改变
print ShuXing.class_shuxing_list  #类可变变量有改变
#print ShuXing.instance_shuxing
#print ShuXing.instance_shuxing_list
a = ShuXing()
print a.class_shuxing   #类不可变变量有改变
print a.class_shuxing_list  #类可变变量有改变
print a.instance_shuxing
print a.instance_shuxing_list

1.Python是一门动态语言,任何实体都可以动态地添加或删除属性。
2.一个类定义了一个作用域。
3.类实例也引入了一个作用域,这与相应类定义的作用域不同。
4.在类实例中查找属性的时候,首先在实例自己的作用域中查找,如果没有找到,则再在类定义的作用域中查找。
5.在对类实例属性进行赋值的时候,实际上会在类实例定义的作用域中添加一个属性(如果还不存在的话),并不会影响到相应类中定义的同名属性。

class ShuXing2(object):
    a = 0
    def __init__(self):
        self.a = 10
        self.b = 20

print ShuXing2.a  # 0
#print ShuXing2.b  #类名不能访问instance变量
a = ShuXing2()  
print a.a  # 10
print a.b  # 20

二:用方法访问变量


1 hasattr():根据输入参数判断某个容器中是否有已该参数为名称的内容,如果有则返回true
2 getattr():取出容器中以参数为名称的内容
3 setattr():对容器中以参数为名称的内容进行修改
4 delattr():删除容器中以参数为名称的内容


class ShuXing2(object):
    a = 0
    def __init__(self):
        self.a = 10
        self.b = 20

a = ShuXing2()
print hasattr(a, 'a')  #True
print getattr(a, 'a')  #10
print setattr(a, 'a', 100)  #None
print getattr(a, 'a') #100
print delattr(a, 'a') #None
print getattr(a, 'a') #0

三:使用特性来管理类实例的属性访问控制

# -*- coding:UTF-8 -*-
class Student(object):

    def __init__(self, score):
        self.__score = score

    @property
    def score(self):
        return self.__score

    @score.setter
    def score(self, value):
        if not isinstance(value, int):
            raise ValueError('score must be an integer!')
        if value < 0 or value > 100:
            raise ValueError('score must between 0 ~ 100!')
        self.__score = value

s = Student(80)
#print s.__score
s.score = 60
print s.score

s.score = 9999
'''
60
Traceback (most recent call last):
  File "lizi2.py", line 24, in <module>
    s.score = 9999
  File "lizi2.py", line 16, in score
    raise ValueError('score must between 0 ~ 100!')
ValueError: score must between 0 ~ 100!
'''

四:描述符管理“类属性”(不是类实例)访问



class Descriptor(object):

    def __init__(self):
        self._name = ''

    def __get__(self, instance, owner):
        print "Getting: %s" % self._name
        return self._name

    def __set__(self, instance, name):
        print "Setting: %s" % name
        self._name = name.title()

    def __delete__(self, instance):
        print "Deleting: %s" % self._name
        del self._name

class Person(object):
    name = Descriptor()
    def  __init__(self, name):
        self._name = name

>>> user = Person()
>>> user.name = 'john smith'
Setting: john smith
>>> user.name
Getting: John Smith
'John Smith'
>>> del user.name
Deleting: John Smith



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-190964-1-1.html 上篇帖子: python的reduce函数 下篇帖子: python3之dict字典 python
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表