Python学习笔记三(开发进阶)

Python学习笔记三(开发进阶)本文主要针对python的package、面向对象编程等进行详述。

大家好,又见面了,我是你们的朋友全栈君。

      本文主要针对python的package、面向对象编程等进行详述。

   1.Python模块

        在Python中,一个.py文件就称之为一个模块(Module),不同的文件目录称为包(Package),每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。

 与java相同,python也有public/private等属性和方法,在一个模块中(Module),是通过”_”前缀来实现的,正常的函数和变量名是公开的(public),可以被直接引用,比如:abc,x123,PI等;类似“__xxx__”这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如上面的“__author__”,“__name__”就是特殊变量,hello模块定义的文档注释也可以用特殊变量“__doc__”访问,我们自己的变量一般不要用这种变量名;类似_xxx和__xxx这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc,__abc等;

       Python module的规范格式    

#!/usr/bin/env python3
# 第一行注释可以让这个hello.py文件直接在Unix/Linux/Mac上运行
# -*- coding: utf-8 -*-
# 第2行注释表示.py文件本身使用标准UTF-8编码

' a test module '
# 一个字符串,表示模块的文档注释,任何模块代码的第一个字符串都被视为模块的文档注释;

__author__ = 'Michael Liao' # 变量把作者写进去,这样当你公开源代码后别人就可以瞻仰你的大名

import sys

def test():
    args = sys.argv   #类似于java main函数中的main(String[] args)中的args
    if len(args)==1:
        print('Hello, world!')
    elif len(args)==2:
        print('Hello, %s!' % args[1])
    else:
        print('Too many arguments!')

 if __name__=='__main__':
    test()
    
    # 当我们在命令行运行hello模块文件时,Python解释器把一个特殊变量__name__置为__main__,而如果在其他地方导入该hello模块时,if判断将失败,因此,这种if测试可以让一个模块通过命令行运行时执行一些额外的代码,最常见的就是运行测试。

    2.面向对象编程     

        类是创建实例的模板,而实例则是一个一个具体的对象,各个实例拥有的数据都互相独立,互不影响,体现了封装特性。

class Student(object):
    def __init__(self, name, score):  # 注意到__init__方法的第一个参数永远是self,表示创建的实例本身
        self.name = name
        self.score = score

    def print_score(self):
        print('%s: %s' % (self.name, self.score))


bart = Student('Bart Simpson', 59)
lisa = Student('Lisa Simpson', 87)
bart.print_score()
lisa.print_score()

    

      输出结果:  

Bart Simpson: 59
Lisa Simpson: 87

   3.继承和多态

class Animal(object):
    def run(self):
        print('Animal is running...')


class Dog(Animal):
    def run(self):
        print('Dog is running...')

    def eat(self):
        print('Eating meat...')


class Cat(Animal):
    def run(self):
        print('Cat is running...')

print("继承")

dog = Dog()
dog.run()

cat = Cat()
cat.run()

print("多态")
def run_animal(animal):
    animal.run()

run_animal(Animal())
run_animal(Dog())
run_animal(Cat())

输出结果:

继承Dog is running...Cat is running...多态Animal is running...Dog is running...Cat is running...

对于静态语言(例如Java)来说,如果需要传入Animal类型,则传入的对象必须是Animal类型或者它的子类,否则,将无法调用run()方法。对于Python这样的动态语言来说,则不一定需要传入Animal类型。我们只需要保证传入的对象有一个run()方法就可以了。

class Timer(object):    def run(self):        print('time run...')run_animal(Timer())

   输出结果: 

time run...

     4.获取对象信息

        1.type(),判断对象类型,type(“abc”),type(123)

        2.isinstance() 判断继承对象的类型
           

a = Animal()
isinstance(a, Animal)

         3.dir() 获得一个对象的所有属性和方法

    

print("#获取对象的方法")
print(dir(dog))

   输出结果:
#获取对象的方法['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'eat', 'run']

      5.Python的类属性(类似于java类的static属性)

       

class Student(object):
    name = 'Student'

       6.类的属性和方法的绑定

  

from types import MethodType


class Student(object):
    pass


s = Student()
s.name = 'Michael'  # 动态给实例绑定一个属性
print(s.name)


def set_age(self, age):  # 定义一个函数作为实例方法
    self.age = age


s.set_age = MethodType(set_age, s)  # 给实例绑定一个方法
s.set_age(25)  # 调用实例方法
print(s.age)  # 测试结果


# 给一个实例绑定的方法,对另一个实例是不起作用的


# 为了给所有实例都绑定方法,可以给class绑定方法

def set_score(self, score):
    self.score = score

Student.set_score = set_score

s.set_score(100)
print(s.score)

    7.__slots__限制类的属性

class Student(object):
    __slots__ = ('name', 'age')  # 用tuple定义允许绑定的属性名称

s = Student()  # 创建新的实例
s.name = 'Michael'  # 绑定属性'name'
s.age = 25  # 绑定属性'age'
s.score = 99  # 绑定属性'score'

     输出结果:

Traceback (most recent call last):   line 7, in <module>    s.score = 99  # 绑定属性'score'AttributeError: 'Student' object has no attribute 'score'




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149562.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • static使用方法小结

    static使用方法小结

    2021年12月10日
    40
  • 服务器查询外网ip的方法

    服务器查询外网ip的方法curlhttpbin.org/ip[root@yx01~]#curlhttpbin.org/ip{“origin”:”120.24.109.9″}[root@yx01~]#

    2022年5月1日
    51
  • 雷塞控制器SMC304简单介绍

    雷塞控制器SMC304简单介绍                           SMC304运动控制器                                                                                            2018.3产品概述:        SMC304控制器(BASIC版):基于嵌入式…

    2022年6月3日
    55
  • 指令周期,时钟周期,总线周期概念辨析图_总线周期是指

    指令周期,时钟周期,总线周期概念辨析图_总线周期是指《指令周期、时钟周期、总线周期概念辨析》由会员分享,可在线阅读,更多相关《指令周期、时钟周期、总线周期概念辨析(2页珍藏版)》请在人人文库网上搜索。指令周期、时钟周期、总线周期概念辨析在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个S周期(状态周期)组成。通常用内存中读取一个指令字的最短时间来规定CPU周期,(也就是计算机通

    2022年10月10日
    0
  • vector>初始化_电脑初始化出现问题

    vector>初始化_电脑初始化出现问题1、默认初始化,vector为空,size为0,未开辟空间,可通过push_back()添加元素。vector&lt;int&gt;v;v.push_back(10);2、默认初始化,指定vector大小,元素初始值默认为0,元素增多时,同样可以通过push_back()来改变vector大小以增加元素。vector&lt;int&gt;v(5)3、指定初始化元素值为2…

    2022年9月18日
    0
  • python hashlib安装_Hashlib加密,内置函数,安装操作数据库「建议收藏」

    python hashlib安装_Hashlib加密,内置函数,安装操作数据库「建议收藏」hashlib模块的md5加密:md5同样的内容加密后是一样的md5加密后是不可逆的。即能加密,没办法解密。撞库:只是针对简单的,因为同样的内容加密后是一样的,难一点就不行了。登录密码:注册时候加密了保存,在登录时再加密,对比加密后内容一致即符合条件登录加盐:目的是增加复杂性。在该加密的内容上,再加上定好的一段儿内容,一同加密。在加上的这段内容,就是1importhashlib2#impor…

    2022年5月31日
    303

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号