在Python中,类也是以class开头定义的。我们定义一个动物类,它有名字和年龄,在java变量有实例变量和局部变量,方法内的变量是局部变量,类里面的变量是实例变量。那么在Python中的类及其属性这些是如何定义使用的呢?

class Animal():
pass

类的属性    

我们知道类都是有属性的,在java中一般是在类中就定义了属性,而在python中是可以直接就给实例添加属性的。

>>> a = Animal()
>>> a.name = 'dog'
>>> print a.name
dog
>>> a
<__main__.Animal instance at 0x0000000002C5E708>
>>>

但是这个属性仅作用于这个实例变量,当我们再次新建一个实例的时候,就没有这个属性了。

>>> b = Animal()
>>> print b.name Traceback (most recent call last):
File "<pyshell#16>", line 1, in <module>
print b.name
AttributeError: Animal instance has no attribute 'name'
>>>

那么如何创建一个类属性呢?可以在内部直接定义一个变量。

>>> class Student():
name = 'Student'
pass >>> a = Student()
>>> print a.name
Student
>>>

实例化对象后可更改这个属性值。

>>> a.name = 'teacher'
>>> print a.name
teacher
>>>

 

类的私有属性

        在java中我们知道可以通过private来控制访问限制,可以修饰变量,也可以修饰方法,使之只能在类的内部使用,那么在python中是如何实现的呢?通过在变量前添加‘__’来定义私有变量。

>>> class Student():
def __init__(self,name):
self.__name = name >>> s = Student('Bob')
>>> s.name Traceback (most recent call last):
File "<pyshell#69>", line 1, in <module>
s.name
AttributeError: Student instance has no attribute 'name'
>>> s.__name Traceback (most recent call last):
File "<pyshell#70>", line 1, in <module>
s.__name

既然私有变量无法直接访问到,那么我们如何使用呢?当时是setter,getter方法,在类的内部为私有变量添加setter和getter方法我们就可以访问和修改它们了。这里就不做描述了。

  限制类的属性

          在python中既然是可以随意给实例添加属性的,那如果我们想限制只能添加给定的属性呢?需要用到__slots__

>>> class  Animal():
__slots__ = ('name','age') >>> a = Animal()
>>> a.name = 'dog'
>>> a.age = 24
>>> a.name
'dog'
>>> a.age
24
>>> a.color = red Traceback (most recent call last):
File "<pyshell#9>", line 1, in <module>
a.color = red
NameError: name 'red' is not defined
>>>

构造方法

          在java中有默认的构造方法,也可以根据我们的需要创建构造方法,实例化对象时根据需要创建符合我们需求的对象。在Python中也是有构造方法的。使用__init__,传入self及需要的变量。

>>> class Animal():
def __init__(self,name,age):
self.name = name
self.age = age >>> a = Animal() Traceback (most recent call last):
File "<pyshell#34>", line 1, in <module>
a = Animal()
TypeError: __init__() takes exactly 3 arguments (1 given)
>>> a = Animal('dog',23)

值得注意的是,当我们写了类的构造方法的时候,实例化对象的时候必须使用构造方法来实例化对象,否则就会报错误。

类方法

          在类中不光有属性还有方法,类方法就是在类中直接定义方法。

>>> class Animal():
def __init__(self,name,age):
self.name = name
self.age = age
def printName(self):
print(self.name) >>> a = Animal('dog',22)
>>> a.printName
<bound method Animal.printName of <__main__.Animal instance at 0x0000000002C64488>>
>>> a.printName()
dog
>>>

面向对象的三大特性,封装,继承,多态,封装不用多说了,在很多地方都有体现。我们来看下python中的继承和多态。

>>> class Animal():
    def __init__(self,name,age):
        self.name = name
        self.age = age
        def printName(self,sex):
        print(self.name,sex)         
>>> a = Animal('dog',22)
>>> a.printName('aa')
('dog', 'aa')
>>> class Dog(Animal):
    pass >>> b = Dog() Traceback (most recent call last):
  File "<pyshell#54>", line 1, in <module>
    b = Dog()
TypeError: __init__() takes exactly 3 arguments (1 given)
\
>>> b = Dog('2哈',12)
SyntaxError: invalid syntax
>>> b = Dog('hashiqi',12)
>>> b
<__main__.Dog instance at 0x0000000002C64848>
>>>

我们定义一个Dog类继承于Animal,当我们实例话的时候发现它的构造方法也是继承于父类,需要传入名字和年龄,但是我们想让它拥有自己的构造方法怎么办呢?重写__init__方法。

>>> class Dog(Animal):
def __init__(self,name,color):
self.name = name
self.color = color >>> b = Dog('2ha','red')
>>>

这样就体现了面向对象的继承和多态。

人生苦短之Python类的一二三的更多相关文章

  1. Python类中super()和__init__()的关系

    Python类中super()和__init__()的关系 1.单继承时super()和__init__()实现的功能是类似的 class Base(object): def __init__(sel ...

  2. LightMysql:为方便操作MySQL而封装的Python类

    原文链接:http://www.danfengcao.info/python/2015/12/26/lightweight-python-mysql-class.html mysqldb是Python ...

  3. python 类属性与方法

    Python 类属性与方法 标签(空格分隔): Python Python的访问限制 Python支持面向对象,其对属性的权限控制通过属性名来实现,如果一个属性有双下划线开头(__),该属性就无法被外 ...

  4. python 类以及单例模式

    python 也有面向对象的思想,则一切皆对象 python 中定义一个类: class student: count = 0         books = [] def __init__(self ...

  5. Python类的特点 (1):构造函数与方法

    Python中,类的特点: #encoding:utf-8 class Parent(object): x=1 #x是Parent类的属性(字段) def __init__(self): print ...

  6. Python类属性,实例属性

    1.Python类数据属性:定义在类里面但在函数外面的变量,它们都是静态的. #一段很简单的代码,但反应了很多 >>> class A(): a=1 #一个类里面有个属性a > ...

  7. python类及其方法

    python类及其方法 一.介绍 在 Python 中,面向对象编程主要有两个主题,就是类和类实例类与实例:类与实例相互关联着:类是对象的定义,而实例是"真正的实物",它存放了类中 ...

  8. python类的定义和使用

    python中类的声明使用关键词class,可以提供一个可选的父类或者说基类,如果没有合适的基类,那就用object作为基类. 定义格式: class 类名(object): "类的说明文档 ...

  9. Python类的探讨

    我们下面的探讨基于Python3,我实际测试使用的是Python3.2,Python3与Python2在类函数的类型上做了改变 1,类定义语法  Python类定义以关键字class开头,一个类定义例 ...

随机推荐

  1. BZOJ——2438: [中山市选2011]杀人游戏

    http://www.lydsy.com/JudgeOnline/problem.php?id=2438 Description 一位冷血的杀手潜入 Na-wiat,并假装成平民.警察希望能在 N 个 ...

  2. IOS开发之----两种保存用户名和密码实现记住密码库

    使用Keychain存储用户敏感信息 iOS的keychain服务提供了一种安全的保存私密信息(密码,序列号,证书等)的方式,每个ios程序都有一个独立的keychain存储.相对于 NSUserDe ...

  3. 给button添加长按手势并侦测到此button

    1, 添加手势 self.longPressRecognizer = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@ ...

  4. BEGINNING SHAREPOINT&#174; 2013 DEVELOPMENT 第12章节--SP 2013中远程Event Receivers 远程Event Receivers App级别生命周期

    BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第12章节--SP 2013中远程Event Receivers  远程Event Receivers App级别生命周期 ...

  5. 转: 如何选CDN:互联网大直播时代的CDN选择指南

    from:  http://www.chnvideo.com/blog-classic-cdn.html SRS 编码器   如何选CDN:互联网大直播时代的CDN选择指南 CDN是一个服务型的公司, ...

  6. 非常easy的JAVA反射教程

    原创文章,转载请注明. 反射能够动态载入类,实例化对象,调用方法.如今以下面样例解说. 一.载入类. Class clazz = Class.forName("java.lang.Strin ...

  7. MySQL命令学习(一)

    今天我们来学习一下MySQL中的经常使用命令(MySQL中的命令keyword是不区分大写和小写的): (1)show databases; 显示MySQL中的全部database (2)create ...

  8. 【环境配置】Linux的经常使用命令

    系统信息 arch 显示机器的处理器架构uname -m 显示机器的处理器架构uname -r 显示正在使用的内核版本号 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI)  ...

  9. STL之set具体解释(二)

    首先来看看set集合容器: set集合容器实现了红黑树的平衡二叉树数据结构.在插入元素时它会自己主动调整二叉树的排列,把该元素放到适当的位置,而且 保证左右子树平衡.平衡二叉检索树採用中序遍历算法. ...

  10. MEMS--微机电系统

    http://baike.baidu.com/view/95221.htm?fromtitle=MEMS&fromid=686299&type=search 微机电系统 编辑   您检 ...