博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python进阶(面向对象编程基础)(二)
阅读量:5129 次
发布时间:2019-06-13

本文共 2521 字,大约阅读时间需要 8 分钟。

1、初始化实例属性

1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 __author__ = 'ziv·chan' 4  5 #定义Person类的__init__方法,除了接受 name、gender 和 birth 外,还可接受任意关键字参数, 6 #并把他们都作为属性赋值给实例. 7 class Person(object): 8  9     def __init__(self,name,gender,age,**kw):10         self.name = name11         self.gender = gender12         self.age = age13         for k,v in kw.iteritems():14             setattr(self,k,v)15 16 ming = Person('ming','male','18',job='student',hobby='bas')17 print ming.age18 print ming.job19 print ming.hobby

几点说明:

解释器内部会将**kw拆分成对应的dict.

setattr()方法接受3个参数:setattr(对象,属性,属性的值),
setattr(self,k,v)相当于self.k = v,
kw.iteritems()历遍字典kw的所有key和value,分别匹配k,v.

2、访问限制

Python对属性权限的控制是通过属性名来实现的,如果一个属性由双下划线开头(__),该属性就无法被外部访问。

1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 __author__ = 'ziv·chan' 4  5 # 给Person类的__init__方法中添加name和score参数, 6 # 并把score绑定到__score属性上,看看外部是否能访问到。 7 class Person(object): 8  9     def __init__(self,name,score):10         self.name = name11         self.__score = score12 13 ming = Person('Bob',60)14 try:15     print ming.name16     print ming.__score17 except AttributeError,e:18     print e19     print('attributeerror')
Bob'Person' object has no attribute '__score'attributeerror

几点说明:

1、双下划线开头的方法或者属性是类的私有属性,外界不能访问  

2、关于 _xxx 和 __xxx 的解释:

一般来讲,2个的区别是:_xxx 可以在子类中使用,__xxx 不可以在子类中使用。

3、创建类属性

类是模板,而实例则是根据类创建的对象。

绑定在一个实例上的属性不会影响其他实例,但是,类本身也是一个对象,如果在类上绑定一个属性,则所有实例都可以访问类的属性,并且,所有实例访问的类属性都是同一个!也就是说,实例属性每个实例各自拥有,互相独立,而类属性有且只有一份。

定义类属性可以直接在 class 中定义:

class Person(object):    address = 'Earth'    def __init__(self, name):        self.name = name

因为类属性是直接绑定在类上的,所以,访问类属性不需要创建实例,就可以直接访问:

print Person.address# => Earth

对一个实例调用类的属性也是可以访问的,所有实例都可以访问到它所属的类的属性:

p1 = Person('Bob')p2 = Person('Alice')print p1.address# => Earthprint p2.address# => Earth

由于Python是动态语言,类属性也是可以动态添加和修改的:

Person.address = 'China'print p1.address# => 'China'print p2.address# => 'China'

因为类属性只有一份,所以,当Person类的address改变时,所有实例访问到的类属性都改变了。

1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 __author__ = 'ziv·chan' 4  5  6 # 给 Person 类添加一个类属性 count,每创建一个实例,count 属性就加 1, 7 # 这样就可以统计出一共创建了多少个 Person 的实例。 8 class Person(object): 9 10     count = 011     def __init__(self):12         # 由于创建实例必定会调用__init__()13         # 方法,所以在这里修改类属性count很合适。14         Person.count += 115 16 17 p1 = Person()18 print p1.count19 20 p2 = Person()21 print p2.count22 23 p3 = Person()24 print p3.count

几点说明:

__int__(self,) 初始化实例的属性,同时也具备普通函数的功能,每执行一次就计算函数内容的运算,函数里面引用类的属性需要带上类名。self为每个实例自身赋值。

 

 

 

 

 

转载于:https://www.cnblogs.com/ziv-chan/p/5501115.html

你可能感兴趣的文章
HDU-4647 Another Graph Game 贪心,博弈
查看>>
easyui datagrid.gridFilter搜索插件
查看>>
Unity GameObject 对象池
查看>>
与WCF有关的一些概念整理
查看>>
CTF入门题_题解
查看>>
开通博客
查看>>
9.26学习内容
查看>>
数据结构和算法
查看>>
《算法导论》——顺序统计RandomizedSelect
查看>>
数据结构27:矩阵加法(基于十字链表)
查看>>
多表头固定demo--html Table
查看>>
bluefish编辑器的配置
查看>>
跟牛牛老师学习python自动化的第九天
查看>>
linux下查看本地程序占用的端口
查看>>
【LeeCode】 15. 3Sum 解题小结
查看>>
软件工程 个人作业3 案例分析
查看>>
2018 noip AFO? 祭
查看>>
MVC5 + EF6 入门完整教程二
查看>>
oc和javascript互相调用
查看>>
新闻列表布局中ie6的变态
查看>>