zoukankan      html  css  js  c++  java
  • python学习第十四天 -面向对象编程基础

    python也是支持面向对象编程的。这一章节主要讲一些python面向对象编程的一些基础。

    什么是面向对象的编程?

    1.面向对象编程是一种程序设计范式

    2.把程序看做不同对象的相互调用

    3.对现实世界建立对象模型

    面向对象编程的基本思想:

    1.类用于定义抽象类型

    2.实例根据类的定义被创建出来

    如何定义一个类并创建实例?

    >>> class Animal(object):
        pass
    
    >>> dog = Animal()
    >>> cat = Animal()

    何为实例属性

    上面创建出了dog,cat实例。怎样让这些实例拥有在各自不同的属性?如果你家的dog有名字,或者cat有名字?

    >>> class Animal(object):
        pass
    
    >>> dog = Animal()
    >>> dog.name = 'wangcai'
    >>> cat = Animal()
    >>> cat.name = 'beibei'

    因为python是动态语言,可以直接为实例添加属性name。

    有时候我们希望dog/cat在出生的时候,就可以拥有属性name。怎么做呢?

    >>> class Animal(object):
        def __init__(self,name):
            self.name = name
    
            
    >>> dog = Animal('wangcai')
    >>> print dog.name
    wangcai

    当创建实例时,__init__()方法被自动调用,而第一个参数self被python解释器传入实例的引用。

    我们有时候给一个实例绑定了很多属性,但是又不希望有些属性被外部直接访问怎么办?

    访问限制

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

    >>> class Animal(object):
        def __init__(self,name,birth):
            self.name = name
            self.__birth = birth
    
            
    >>> dog = Animal('wangcai','2016-08-04')
    >>> print dog.name
    wangcai
    >>> print dog.__birth
    
    Traceback (most recent call last):
      File "<pyshell#100>", line 1, in <module>
        print dog.__birth
    AttributeError: 'Animal' object has no attribute '__birth'

    由单下划线开头的属性’_xxx‘可以被派生类子类访问。类型于(protected).

    那么实例既然有属性,是否可以定义类的属性?

    类属性

    先说说类属性和实例属性的区别?

    实例属性每个实例各自拥有,互相独立,而类属性有且只有一份。

    >>> class Person(object):
        address = 'west'
        def __init__(self,name):
            self.name =name
    
            
    >>> print Person.address
    west
    >>> p1 = Person('liunx')
    >>> print p1.address
    west

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

    >>> Person.address = 'earth'
    >>> p1.address
    'earth'

    但是如果类属性和实例属性名字冲突了怎么办?

    >>> class Person(object):
        address = 'west'
        def __init__(self,name):
            self.name =name
    
    >>> p1 = Person('liunx')
    >>> p1.address = 'earth'//实例属性address
    >>> print Person.address
    west
    >>> Person.address = 'west_1' //修改类属性
    >>> print p1.address //实例属性不变,还是earch
    earth

    可见,当实例属性和类属性重名时,实例属性优先级高,它将屏蔽掉对类属性的访问

    python的类属性可以类比为java中的静态变量。

    有时候我们不希望实例的私有属性被外部直接显示调用。但是又希望在外部能被隐式调用。

    定义实例方法

    >>> class Animal(object):
        def __init__(self,name):
            self.__name = name
        def get_name(self):
            return self.__name
    
        
    >>> dog = Animal('wangcai')
    
    >>> print dog.get_name()
    wangcai

    这就是python面向对象数据封装的形式。保护内部数据的一致性。

    既然实例有自己的方法,类也是有类方法。

    定义类方法

    >>> class Person(object):
        count = 0
        @classmethod
        def how_many(cls):
            return cls.count
        def __init__(self, name):
            self.name = name
            Person.count = Person.count + 1
    
            
    >>> print Person.how_many()
    0
    >>> p1 = Person('liunx')
    >>> print Person.how_many()
    1

    通过标记一个@classmethod,就可以将方法绑定到Person类上,而非类的实例。类方法的第一个参数将传入类本身。上面的cls.count相当于Person.count.类方法无法获得任何实例变量,智能获得类的引用。可以类比于java的静态方法。

    小结:主要是讲解一些面向对象的基础。

  • 相关阅读:
    向值栈放List集合
    向值栈放对象
    向值栈放数据
    wsgi初探
    python_swift_project_swift使用
    python_swift_project_middleware
    ubuntu 安装 swift
    20140905
    eventlet
    resource
  • 原文地址:https://www.cnblogs.com/nx520zj/p/5736617.html
Copyright © 2011-2022 走看看