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 = name
  11. self.gender = gender
  12. self.age = age
  13. for k,v in kw.iteritems():
  14. setattr(self,k,v)
  15.  
  16. ming = Person('ming','male','',job='student',hobby='bas')
  17. print ming.age
  18. print ming.job
  19. 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 = name
  11. self.__score = score
  12.  
  13. ming = Person('Bob',60)
  14. try:
  15. print ming.name
  16. print ming.__score
  17. except AttributeError,e:
  18. print e
  19. print('attributeerror')
  1. Bob
  2. 'Person' object has no attribute '__score'
  3. attributeerror

几点说明:

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

2、关于 _xxx 和 __xxx 的解释:

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

3、创建类属性

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

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

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

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

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

  1. print Person.address
  2. # => Earth

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

  1. p1 = Person('Bob')
  2. p2 = Person('Alice')
  3. print p1.address
  4. # => Earth
  5. print p2.address
  6. # => Earth

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

  1. Person.address = 'China'
  2. print p1.address
  3. # => 'China'
  4. print p2.address
  5. # => 'China'

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

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

几点说明:

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

 

Python进阶(面向对象编程基础)(二)的更多相关文章

  1. Python进阶(面向对象编程基础)(三)

    6.类属性和实例属性名字冲突怎么办 修改类属性会导致所有实例访问到的类属性全部都受影响,但是,如果在实例变量上修改类属性会发生什么问题呢? class Person(object): address ...

  2. Python进阶(面向对象编程基础)(一)

    鉴于昨天被类和函数折腾得晕头转向,今特把类的知识翻出来温习. 1.定义类并创建实力对象 #!/usr/bin/env python # -*- coding:utf-8 -*- __author__ ...

  3. Python进阶(面向对象编程基础)(四)

    1.方法也是属性 我们在 class 中定义的实例方法其实也是属性,它实际上是一个函数对象: class Person(object): def __init__(self, name, score) ...

  4. Python——11面向对象编程基础

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  5. Python进阶 函数式编程和面向对象编程等

    函数式编程 函数:function 函数式:functional,一种编程范式.函数式编程是一种抽象计算机的编程模式. 函数!= 函数式(如计算!=计算机) 如下是不同语言的抽象 层次不同 高阶函数: ...

  6. Python 面向对象编程基础

    Python 面向对象编程基础 虽然Pthon是解释性语言,但是Pthon可以进行面向对象开发,小到 脚本程序,大到3D游戏,Python都可以做到. 一类: 语法: class 类名: 类属性,方法 ...

  7. Python基础 — 面向对象编程基础

    目录 1. 面向对象编程基础 2. 定义类和创建对象 3. init() 方法 4. 魔法方法 5. 访问可见性问题 5. 练习 1. 面向对象编程基础 把一组数据结构和处理它们的方法组成对象(obj ...

  8. Python学习-第三天-面向对象编程基础

    Python学习-第三天-面向对象编程基础 类和对象 简单的说,类是对象的蓝图和模板,而对象是类的实例.这个解释虽然有点像用概念在解释概念,但是从这句话我们至少可以看出,类是抽象的概念,而对象是具体的 ...

  9. [Java入门笔记] 面向对象编程基础(二):方法详解

    什么是方法? 简介 在上一篇的blog中,我们知道了方法是类中的一个组成部分,是类或对象的行为特征的抽象. 无论是从语法和功能上来看,方法都有点类似与函数.但是,方法与传统的函数还是有着不同之处: 在 ...

随机推荐

  1. Linux 机器之间建立互信

    原理: 就是两台机器(web-1和web-2)经过预先设置好经过认证的key文件,双方互相访问时,进行自动认证,从而实现互信.   互信的原理了解了,我们可以把配置ssh互信的步骤进行有效的分割. 1 ...

  2. ListActivity ListView 使用 介绍 用法

    ListActivity简单的说就是ListView和Activity的结合,跟ListView和Activity组合实现的没有什么很大的差别,主要是比较方便. 在实现时,要注意: 1.一般情况,Li ...

  3. cassandra新增、更新、删除数据。

    package client; import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java ...

  4. php视图操作

    一.视图的基本介绍          视图是虚拟的表.与包含数据的表不一样,视图只包含使用时动态检索数据的查询.         使用视图需要MySQL5及以后的版本支持.         下面是视图 ...

  5. python3.5文档

    https://docs.python.org/3.5/tutorial/modules.html#packages

  6. Remoting通讯实例

    Remoting通讯可以实现不同应用程序域之间的通信(可以为一台机器不同程序,也可以不同机器上的不同程序) 实例步骤: (1)编写透明代理类 新建一个类库,命名空间:MyRemoting 在该类库中建 ...

  7. linux运维面试题汇总一

    1.如何让history历史命令显示命令使用的具体时间? [root@node0 ~]# export HISTTIMEFORMAT='%F  %T ' [root@node0 ~]# history ...

  8. OpenStack点滴03-Neutron

    OpenStack Neutron是一个比较复杂的组件,如果说OpenStack安装部署过程哪一个组件最麻烦,那就肯定是网络组件Neutron了. 因为我对OpenStack网络这块也不是很熟,就把我 ...

  9. WinMain与WndProc以及窗口诞生过程总结

    一.int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int nCmdShow) 四个 ...

  10. 转:MFC文件操作

    讲到文件操作我们会联想到自己手动操作文件会涉及到哪些内容.很容易想到的是查看文件(文件夹)是否存在,创建,复制,删除,剪切文件(文件夹).另外就是设置文件的属性. 那MFC中一些操作文件的类也差不多是 ...