Python进阶(面向对象编程基础)(二)
1、初始化实例属性
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'ziv·chan' #定义Person类的__init__方法,除了接受 name、gender 和 birth 外,还可接受任意关键字参数,
#并把他们都作为属性赋值给实例.
class Person(object): def __init__(self,name,gender,age,**kw):
self.name = name
self.gender = gender
self.age = age
for k,v in kw.iteritems():
setattr(self,k,v) ming = Person('ming','male','',job='student',hobby='bas')
print ming.age
print ming.job
print ming.hobby
几点说明:
解释器内部会将**kw拆分成对应的dict.
setattr()方法接受3个参数:setattr(对象,属性,属性的值),
setattr(self,k,v)相当于self.k = v,
kw.iteritems()历遍字典kw的所有key和value,分别匹配k,v.
2、访问限制
Python对属性权限的控制是通过属性名来实现的,如果一个属性由双下划线开头(__),该属性就无法被外部访问。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'ziv·chan' # 给Person类的__init__方法中添加name和score参数,
# 并把score绑定到__score属性上,看看外部是否能访问到。
class Person(object): def __init__(self,name,score):
self.name = name
self.__score = score ming = Person('Bob',60)
try:
print ming.name
print ming.__score
except AttributeError,e:
print e
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
# => Earth
print p2.address
# => Earth
由于Python是动态语言,类属性也是可以动态添加和修改的:
Person.address = 'China'
print p1.address
# => 'China'
print p2.address
# => 'China'
因为类属性只有一份,所以,当Person类的address改变时,所有实例访问到的类属性都改变了。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__ = 'ziv·chan' # 给 Person 类添加一个类属性 count,每创建一个实例,count 属性就加 1,
# 这样就可以统计出一共创建了多少个 Person 的实例。
class Person(object): count = 0
def __init__(self):
# 由于创建实例必定会调用__init__()
# 方法,所以在这里修改类属性count很合适。
Person.count += 1 p1 = Person()
print p1.count p2 = Person()
print p2.count p3 = Person()
print p3.count
几点说明:
__int__(self,) 初始化实例的属性,同时也具备普通函数的功能,每执行一次就计算函数内容的运算,函数里面引用类的属性需要带上类名。self为每个实例自身赋值。
Python进阶(面向对象编程基础)(二)的更多相关文章
- Python进阶(面向对象编程基础)(三)
6.类属性和实例属性名字冲突怎么办 修改类属性会导致所有实例访问到的类属性全部都受影响,但是,如果在实例变量上修改类属性会发生什么问题呢? class Person(object): address ...
- Python进阶(面向对象编程基础)(一)
鉴于昨天被类和函数折腾得晕头转向,今特把类的知识翻出来温习. 1.定义类并创建实力对象 #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ ...
- Python进阶(面向对象编程基础)(四)
1.方法也是属性 我们在 class 中定义的实例方法其实也是属性,它实际上是一个函数对象: class Person(object): def __init__(self, name, score) ...
- Python——11面向对象编程基础
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- Python进阶 函数式编程和面向对象编程等
函数式编程 函数:function 函数式:functional,一种编程范式.函数式编程是一种抽象计算机的编程模式. 函数!= 函数式(如计算!=计算机) 如下是不同语言的抽象 层次不同 高阶函数: ...
- Python 面向对象编程基础
Python 面向对象编程基础 虽然Pthon是解释性语言,但是Pthon可以进行面向对象开发,小到 脚本程序,大到3D游戏,Python都可以做到. 一类: 语法: class 类名: 类属性,方法 ...
- Python基础 — 面向对象编程基础
目录 1. 面向对象编程基础 2. 定义类和创建对象 3. init() 方法 4. 魔法方法 5. 访问可见性问题 5. 练习 1. 面向对象编程基础 把一组数据结构和处理它们的方法组成对象(obj ...
- Python学习-第三天-面向对象编程基础
Python学习-第三天-面向对象编程基础 类和对象 简单的说,类是对象的蓝图和模板,而对象是类的实例.这个解释虽然有点像用概念在解释概念,但是从这句话我们至少可以看出,类是抽象的概念,而对象是具体的 ...
- [Java入门笔记] 面向对象编程基础(二):方法详解
什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...
随机推荐
- View原理
View处理: 绘制(paint canvas path:tween等动画效果).事件处理 参考整理自: Custom Components: http://developer.android.c ...
- yii [error] [exception.CHttpException.404] exception 'CHttpException' with message 'Unable to resolve the request "favicon.ico".'
yii使用中,发现runtime文件夹下出现这个错误信息 解决办法:在生成的APP程序根目录下建.htaccess文件(前提是需要开启apache重写,具体如何开,查资料咯) 然后配置如下 <I ...
- LSI MegaCl i命令使用1
MegaCli命令使用:cd /opt/MegaRAID/MegaCli/MegaCli -AdpAllInfo -aAll [显示所有适配器信息]MegaCli -LDInfo -Lall ...
- 3_Linux_文件搜索指令
.3文件搜索命令 1)which 查找一个命令所在的路径 whereis 提供命令的帮助文件的信息 whatis 显示命令的概要信息whatis ls which提供命令的别名信息 2)find,基本 ...
- linux telnet服务安装与配置
关闭防火墙:service iptabls stop chkconfig iptabls off 1.安装telnet服务 [root@rheltest1 ~]# rpm -qa ...
- 命令passwd报错因inode节点处理记录
命令passwd报错因inode节点处理记录故障现象:1.修改密码时报错 passwd: Authentication token manipulation error2.添加用户报错:unable ...
- 关于PHP伪静态Rewrite设置
Rewirte主要的功能就是实现URL的跳转和隐藏真实地址,基于Perl语言的正则 表达式规范.平时帮助我们实现拟静态,拟目录,域名跳转,防止盗链等 一.Apache配置: 1.支持httpd ...
- $(this).val()与this.value的区别?text()与html()的区别?
$(this).val()与this.value 作用:都是获得当前Dom对象的value值(一般是表单元素) text radio checkbox select 基本没有什么区别,只是: this ...
- 最完美的匹配网页中图片 src 部分的正则表达式
$str='<p style="padding: 0px; margin-top: 0px; margin-bottom: 0px; line-height: 200%;"& ...
- php的header()函数前有echo输出情况分析
php的header()方法一般被用来告知浏览器做一些什么样的操作,比如跳转,刷新等等:而调用header方法前,如果使用echo输出一些内容,会发生什么情况呢?会对header函数有影响吗?我们实验 ...