Python基础学习(三)

栏目: Python · 发布时间: 5年前

内容简介:Python从设计之初就已经是一门面向对象的语言;面向对象能有效提高编程的效率,通过封装技术,消息机制可以像搭积木的一样快速开发出一个全新的系统。面向对象是指一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的集合。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。PS. 其实R语言也有面向对象编程,也有面向对象的3个特征:封装、继承、多态Python类的使用比较广泛,总能在各个Python代码中看到(尤其是伪代码),根据资料理解下Python面向对象的几个概念和

面向对象

Python从设计之初就已经是一门面向对象的语言;面向对象能有效提高编程的效率,通过封装技术,消息机制可以像搭积木的一样快速开发出一个全新的系统。面向对象是指一种程序设计范型,同时也是一种程序开发的方法。对象指的是类的集合。它将对象作为程序的基本单元,将程序和数据封装其中,以提高软件的重用性、灵活性和扩展性。

PS. 其实R语言也有面向对象编程,也有面向对象的3个特征:封装、继承、多态

Python类的使用比较广泛,总能在各个 Python 代码中看到(尤其是伪代码),根据资料理解下Python面向对象的几个概念和简单的使用

具体名字概念(类、方法、实例化、对象等基础名词)可以看: Python3 面向对象 ,其中主要的就是使用类和对象来编程

其中对于类变量和实例变量最初有点迷糊,但看了下面的例子后就清晰了

class foo:
    def __init__(self):
        self.x = 10
    def add(self, y):
        return self.x + y

f = foo()
print(f.x)  #5

f.a = 10
foo.a = 20
print(f.x, f.a, foo.a)  #5 10 20

foo.b = 30
f.c = 40

f2 = foo()
print(f2.x) # 5
print(f2.a) # 20
print(f2.b) # 30
print(f2.c) # error 'foo' object has no attribute 'c'

以上例子可看出, f.af.c 为实例变量,其只能作用于某一个实例上,因此在 f2.c 就报错了;而 foo.afoo.b 为类变量,其可以被不同对象继承

以上述foo类为例, f = foo() 是实例化类, f.x 则是属性引用(在类中,属性是用变量来表示的); __init__ 是特殊方法(在类实例化时自动调用)而 add 则是自定义方法,方法可以直接访问实例的数据; self 代表类的实例,比如 self.x 就是实例变量,其也是类的方法和普通函数唯一的差别之处,而 self.class 则是类,也可以将self替换成其他字符,但是常用一般就这个了

对于方法的调用,在类实例化后可像函数那样使用,如:

f = foo()
print(f.add(10))

在类中可以增加私有变量,使得其在外部无法被访问,如在 print(p.__secret) 会报错 'private' object has no attribute '__secret'

class private:
    __secret = 10
    public = 20

p = private()
print(p.public)
print(p.__secret)

类的可以继承,这也是能有效的提高编程的效率,可以减少一些重复的编程工作,即子类可以继承父类的(其实也就是将多个公共的方法放到父类中,然后子类继承父类),如:

class common:    
    def __init__(self):
        self.x = 1
        self.y = 2

    def add(self, w):
        return self.x + self.y + w

c = common()
print(c.add(10))

class foo1(common):
    def __init__(self):
        common.__init__(self)
        self.x += 1
        self.y += 2

f1 = foo1()
print(f1.add(10))

从上面代码可看出,父类是common,子类在调用父类时用 class foo1(common) 表示foo1类继承了common类,然后用 common.__init__ 这种形式调用父类的属性,并且不需要再写一遍 add 方法即可在子类中使用

模块与包

类似于R包,Python也有将定义的函数和变量封装的封装的方法-模块,以便在其他程序中调用

比如在 app.py 脚本中定义了一个函数:

def func(x,y):
print(x, "+", y, "=", x + y)

然后在 test.py 脚本中调用 app.py 中的 func 函数,同时在 app.py 所在目录下会生成一个 __pycache__ 文件夹

import app
app.func(*(1,2))
>1 + 2 = 3
print(app.__name__)
>app

如果不是在当前目录下的模块,可以用 sys.path 查看下Python对于模块的搜索路径有哪些

import sys
print(sys.path)

然后可以用 dir() 函数来查看模块内定义的名称

dir(app)

Python不仅像上述那样调用方法,还可以调用模块变量和类变量等,如新建一个 app_class.py

a = 1
b = 2

print(a + b)

def func(x,y):
    print(x, "+", y, "=", x + y)

class Myclass:
    i = 123

    def f(self):
        return("Learning Python")

    def cf(self):
        print("cf:", self.cf)

然后在 test.py 中调用 app_class.py ,即 import app ,输出 1 + 2 = 3 ,如果再一次 import app 则无输出,这是因为模块只有第一次被导入的时候才会被执行,从输出的结果上可看出,模块变量在模块初始化的时候就被执行了,类变量其实也一样,而函数和类的方法则是在初始化后被调用时才执行

app.a
app.func(3,5)
app.Myclass.f(1)

如果你将 __name__ 设置为 __main__ ,则可以将模块跟脚本一样执行可接受外部参数,如在代码最后添加一些脚本输出:

if __name__ == "__main__":
    import sys
    print("Learning Python3", sys.argv[1])

我一直粗略的把R包理解成一大堆R函数的集合,Python对于包的定义则是:

包是一种管理Python模块命名空间的形式

R中是以 :: 来精确调用不同R包下的函数,而Python则是用 . 来实现的

Python包的结构如下:

package1/
    __init__.py
    subPack1/
        __init__.py
        module1_1.py
        module1_2.py
        module1_3.py
    subPack2/
        __init__.py
        module2_1.py
        module2_2.py

Python包中必须包含一个 __init__.py 文件,用于初始化代码或者 __all__ 变量赋值;一般我们导入包中特定的子模块会用这种方法: from docx.shared import Inches ,其中shared是docx包的子模块,Inches则是其中的函数;当 __init__.py 文件写入 __all__ = ["XX1", "XX2", "XX3"] 时,那么在用 from package import * 时,只会导入XX1/XX2/XX3子模块,如果没定义的话,则不会导入这三个子模块,而是将包中的所有定义的内容都导入

本文出自于 http://www.bioinfo-scrounger.com 转载请注明出处


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

点石成金

点石成金

[美] 克鲁格 (Steve Krug) / 蒋芳 / 机械工业出版社 / 2015-1-1 / CNY 59.00

《点石成金:访客至上的Web和移动可用性设计秘笈(原书第3版)》是一本关于Web设计原则而不是Web设计技术的书。《点石成金:访客至上的Web和移动可用性设计秘笈(原书第3版)》作者是Web设计专家,具有丰富的实践经验。他用幽默的语言为你揭示Web设计中重要但却容易被忽视的问题,只需几个小时,你便能对照书中讲授的设计原则找到网站设计的症结所在,令你的网站焕然一新。一起来看看 《点石成金》 这本书的介绍吧!

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具