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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PKI体系及常见证书

    PKI体系及常见证书http://blog.chinaunix.net/space.php?uid=23637692&do=blog&id=30579881.PKI体系1.1PKI(PublicKeyInfrastructure,公钥基础架构)PKI是一套以公钥技术为基础、提供安全服务的架构,由认证机构(CA),数字证书库,密钥备份和恢复,证书作废系统,应用接口等组成。CA是PK

    2022年8月22日
    9
  • 如何运行SpringBoot项目

    如何运行SpringBoot项目最近在Ecplise上面写了一个简单的SpringBoot的测试项目,SpringBoot里面是有主函数的:我们知道的是在Ecplise上面找到这个主函数然后runas-&gt;javaApplication就可以了但是总不能一直不脱离Ecplise,总要出来自己单练的第一步:我就新建的一个文件夹boottest,然后右键导出整个工程:导出的是jar包,然后我们看…

    2022年10月13日
    3
  • mysql 左连接 自连接 例子

    mysql 左连接 自连接 例子连接就是将两个表按照某个公共字段来拼成一个大表。左连接就是在做连接是以左边这个表为标准,来遍历右边的表。例子:用户访问记录:问题:查出看了湖南卫视但没有看北京卫视的用户信息逻辑:先通过左连接将看了湖南卫视和北京卫视的查出来,然后再将看了湖南卫视但不在刚才查出的结果中的用户查出来。SELECT*FROMtest_visitWHEREchannel=’

    2022年5月28日
    30
  • 安装Ubuntu 21.04后要做的事「建议收藏」

    安装Ubuntu 21.04后要做的事「建议收藏」Ubuntu19.10发布了,带来了很多新特性,同样也依然带着很多不习惯的东西,所以装完系统后还要进行一系列的优化。1.删除libreofficelibreoffice虽然是开源的,但是Java写出来的office执行效率实在不敢恭维,装完系统后果断删掉sudoapt-getremovelibreoffice-common2.删除Amazo…

    2022年5月15日
    45
  • Linux配置Java环境变量 详解「建议收藏」

    Linux配置Java环境变量 详解「建议收藏」一、官网下载JDKJDK官方下载地址:https://www.oracle.com/cn/java/technologies/javase-downloads.html​ 打开此网址可以看到目前所有维护中的JDK的发行版本,在此找到你需要的版本即可,我们这里选择JDK1.8版本进行演示。​ 下拉找到JavaSE8标题,然后点击JDKDownload,将跳转至JDK8版本选择页面。​ 选择合适安装包进行点击下载。所有JDK版本的历史版本:https://www.oracle.com/j

    2025年5月26日
    2
  • poj1195(二维树状数组)

    poj1195(二维树状数组)

    2021年7月6日
    101

发表回复

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

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