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的静态方法。

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

时间: 2024-10-11 09:27:58

python学习第十四天 -面向对象编程基础的相关文章

python学习八十四天:爬虫基础

爬虫基础 爬虫相关概念简介 什么是爬虫 爬虫就是通过编写程序模拟浏览器上网,然后让其去互联网上抓取数据的过程. 哪些语言可以实现爬虫 1.php:可以实现爬虫.php被号称是全世界最优美的语言(当然是其自己号称的,就是王婆卖瓜的意思),但是php在实现爬虫中支持多线程和多进程方面做的不好. 2.java:可以实现爬虫.java可以非常好的处理和实现爬虫,是唯一可以与python并驾齐驱且是python的头号劲敌.但是java实现爬虫代码较为臃肿,重构成本较大. 3.c.c++:可以实现爬虫.但是

python 学习_第四模块 并发编程(多线程)

python 学习_第四模块 并发编程(多线程) 1  开启线程方式 from threading import Thread import time def say(name): time.sleep(2) print("%s hello"%name) if __name__ =="__main__": t = Thread(target=say,args=("alex",)) t.start() print("主线程")

我的python学习--第十四天(二)

一.ansible api 在了解python的ansible api之前,先简单了解一下ansible. ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量程序部署.批量运行命令等功能. ansible是基于模块工作的,本身没有批量部署的能力.真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架.主要包括: 连接插件connection p

python学习第十四节(正则)

python2和python3都有两种字符串类型strbytes re模块find一类的函数都是精确查找.字符串是模糊匹配 findall(pattern,string,flags) replace函数'hello python'.replace('p','P')'hello Python' a='sadfadf232wwewfr323rwef34534trwef'import rew=re.findall('\d','sadfadf232wwewfr323rwef34534trwef')w=r

python学习笔记(十四) - easy_install安装与使用

一. 背景知识 在使用python的时候,经常会使用到本身没有安装的第三方模块,这时我们就需要使用easy_install 二. 使用方法 1. 下载easy_setup.py的源代码:http://pypi.python.org/pypi/setuptools 2. 用记事本存放源码并命令为easy_setup.py 3. 双击运行或在命令行运行:python easy_setup.py 4. 在python的安装目录python\scripts目录中可以看到有好几个easy_install的

android学习二十四(网络编程的最佳实践)

前面的博客已经讲解了HttpURLConnection和HttpClient的用法,知道了如何发起HTTP请求,以及解析服务器返回 的数据.但是可能你发现了,因为一个应用程序很多地方都可能使用网络功能,而发送HTTP请求的代码基本相同,如果每次我们都去编写一遍发送HTTP请求的代码,这显然不太好. 通常情况下我们都应该将这些通用的网络操作提取到一个公共的类里,并提供一个静态方法,当想要发起网络请求的时候只需简单地调用一下这个方法即可.比如下面的写法: package com.jack.netwo

python学习笔记(十四): unittest

Python中有一个自带的单元测试框架是unittest模块,用它来做单元测试,它里面封装好了一些校验返回的结果方法和一些用例执行前的初始化操作. 在说unittest之前,先说几个概念: TestCase 也就是测试用例 TestSuite 多个测试用例集合在一起,就是TestSuite TestLoader是用来加载TestCase到TestSuite中的 TestRunner是来执行测试用例的,测试的结果会保存到TestResult实例中,包括运行了多少测试用例,成功了多少,失败了多少等信

python学习三十四天函数高阶函数定义及用法

python函数高阶函数是把函数当成一个变量,传递给函数作为参数,或者函数的返回值里面有函数,都称为高阶函数, 1,把函数作为参数传递 def dac(x,y): return x+y def test(n): print(n) test(dac) 输出结果为 函数类型function 2,把函数做为返回值,也是高阶函数 def test(x,y): return abs,x,y 输出结果为 列表,包含 函数,参数 文章来自(www.96net.com.cn) 原文地址:https://www.

PHP学习笔记十四【面向对象】

<?php class Cat{ public $name; public $age; public $color; } //创建一个对象 $cat1=new Cat(); $cat1->name="小白"; //给对象成员赋值 $cat1->age=3; $cat1->color="白色"; echo $cat1->name."||".$cat1->age."||".$cat1->c