zoukankan      html  css  js  c++  java
  • python3 面向对象

    # 指定文本编码格式

    ## 指定编码格式的注释

    # *_* coding:utf8 *_*

    ## 指定字符串使用的编码格式

    hello_str=u“hello世界”# 使用u指定字符串用utf8编码进行解析

    # 类

    ## 空对象None关键字

    ### 身份运算符

    is  #可用于比较两个变量的内存地址是否相等,判断数据是否为None时也推荐使用is

    is not

    ## 大驼峰命名法

    首字母大写,单词与单词之间不使用下划线

    ## 内置函数

    dir() :传入变量名,可查看该变量对应的方法,包括内置方法(__fuctionName__)

    ## 定义类并创建对象

    class Cat:  #定义类,首字母大写

    def eat(self):  # 创建方法

           # self说明:哪一个对象调用该方法,self就是这个对象的引用,可以通过self.的方式获取这个对象的属性

            print("小猫吃鱼")

        def drink(self):

            print("小猫喝水")

    tom = Cat()  # 创建对象

    tom_cat = Cat()  # 使用同一个类创建的不同对象,对象本身也不相同,在内存中都分配有不同的id

    tom.name=“大猫” # 直接给tom对象增加属性,不推荐使用

    tom.eat()  # 调用对象中的方法

    tom.drink()

    ## __init__(self) 初始化方法

    class Cat:

        def __init__(self,new_name):

            print("初始化方法")

            # self.name = "Tom"  # 初始化时可以给类创建属性

                  self.name = new_name # 以参数的形式传递属性值

    tom = Cat()  # 创建对象时会自动调用初始化方法,执行__init__方法

    tom2 = Cat(“tom2”)

    print(tom.name)

    print(tom2.name) 

    ## __del__(self) 销毁执行方法

    class Cat:

        def __del__(self):

            print("最后执行del")

    tom = Cat()  # 创建对象

    print("*" * 50)  #此处打印在“最后执行del”之前,因为__del__在所有执行完后回收内存时执行

    ## __str__(self) 更改

    class Cat:

        def __str__(self):

            print("最后执行del")

            return "这是打印对象的返回值"

    tom = Cat()  # 创建对象

    print(tom)  # 此处打印__str__的返回值,而不是对象信息

    ## __new__方法,为对象分配空间

    class Tool(object):  # 传递基类object到当前类中

        def __new__(cls, *args, **kwargs):  # 重写子类的__new__方法

            print("分配空间")

            instance = super().__new__(cls)  # 调用父类中的__new__方法,返回当前类对象,否则重写__new__后当前类无法执行__init__方法

            print(instance)

            # return instance

        def __init__(self):

            print("初始化")

    tool1 = Tool()

    ### 使用__new__进行单例设计,让类创建的实例,使用相同的内存引用

    class Tool(object):

        instance = None  # 定义一个空的内置属性

        def __new__(cls, *args, **kwargs):

            if cls.instance is None:

                cls.instance = super().__new__(cls)  #第一次为空时,保存创建的应用实例

            return cls.instance

    tool1 = Tool()

    print(tool1)  #输出结果内存地址相同

    tool2 = Tool()

    print(tool2)

    ## 私有属性和方法(在属性名和方法名前增加__双下划线),父类的私有属性和方法子类无法继承

    class Cat:

        def __init__(self):

            self.__age = 18   #定义私有属性

        def get_age(self):

            print("年龄%d" % self.__age)  # 内部可以访问私有

            self.__secret()  # 内部可以调用私有方法

        def __secret(self):  #定义私有方法

            print("私有方法")

            pass

    tom = Cat()  # 创建对象

    tom.get_age()  

    tom.__secret()  #外部无法访问私有方法

    print(tom.__age)  #外部无法访问私有属性

    print(tom._Cat__age) # 外部访问私有属性

    ## 类的继承

    class Animal:

        def eat(self):

            print("eat")

        def drink(self):

            print("drink")

    class Cat(Animal):  #在类中传递需要继承的类名,子类拥有父类的所有属性和方法

           def eat(self): # 子类中重写方法,后续调用时会覆盖父类中的方法

                  print("eat重写")

    tom = Cat()  # 创建对象

    tom.eat()  # 可以执行继承的类的方法

    tom.drink()

    专业说法:Cat类继承自Animal类,是Animal类的子类,也可说Cat类是Animal类的派生类

    ### 使用super方法调用父类同名的方法

    class Animal:

        def eat(self):

            print("eat原版")

        def drink(self):

            print("drink")

    class Cat(Animal):

        def eat(self):

            print("eat重写")

            super().eat()  #使用super对象,调用父类同名的方法

    tom = Cat()  # 创建对象

    tom.eat()

    Animal.eat(tom) #python2 早期版本没有super,调用父类的其他方法

    ### 多继承

    class A:

        def eat(self):

            print("eat原版")

    class B:

        def eat(self):

            print("eat重写")

    class C(A,B):  # 继承多个父类

        pass

    ## 类的属性和方法

    ### 类属性

    class Tool:

        count = 0  # 定义一个类属性

        def __init__(self):

            Tool.count += 1  # 操作类属性的值

    tool1 = Tool()

    print(Tool.count)  # 使用类名打印类属性 (推荐类名访问类属性)

    print(tool1.count)  # 使用实例化对象打印类属性

    ### 类方法

    class Tool:

        count = 0

        def __init__(self):

            Tool.count += 1

        @classmethod   # 通过classmethod关键字声明下面定义的方法是类方法

        def show_count(cls):

            print(cls.count)  # 类方法中可以通过cls对象调用类属性

    tool1 = Tool()

    Tool.show_count()  #通过类名调用类方法

    tool1.show_count()

    ## 类中的静态方法

    class Tool:

        @staticmethod  #通过staticmethod关键字定义静态方法  

        def show_static_func():  # 静态方法不传递self参数对象

            print("这是静态方法")

    Tool.show_static_func()  #通过类名调用静态方法

    # 异常处理 try

    try:

        num = int(input("请输入一个整数"))

    except:  # 捕获异常,如输入a字母则执行下方代码

    print("请输入正确的整数")

    ## 针对已知的错误异常抛出对应的错误信息

    try:

        num = int(input("请输入一个整数"))

        result = 8 / num

    except ZeroDivisionError:  #除数为0

        print("除0错误")

    except ValueError:  # 错误的值

    print("请输入整数")

    ## 捕获未知错误,和else,finally执行逻辑

    try:

        num = int(input("请输入一个整数"))

        result = 8 / num

    except Exception as result: # 捕获未知错误并返回未知信息result

        print("未知错误%s" % result)

    else:

        print("无异常时执行")

    finally:

        print("无论是否有异常都执行")

    ## 主动抛出异常并捕获

    def input_password():

        pwd = input("请输入密码")

        if len(pwd) >= 8:

            return pwd

        print("抛出异常")

        ex = Exception("密码长度不够")  #通过Exception方法定义异常

        raise ex  #通过 raise方法抛出异常

    try:

        input_password()

    except Exception as result:  # 捕获抛出的异常

    print(result)

    # 模块操作

    ## 给导入的模块其别名

    import ta_02_mode as TryMode  # 别名使用大驼峰命名

    ## from … import 导入模块中的部分工具

    from ta_02_mode import input_password

    from ta_02_mode import input_password as input_password2 # 局部导入使用别名

    input_password()  # 使用部分导入,可以直接通过函数名调用

    from ta_02_mode import * # 导入模块中所有工具(不推荐使用)

    ## 在模块中使用__name__判断当前模块中代码的执行主体,如果为__main__表示模块被直接执行不是导入

    因为模块在导入加载时,所有的代码都会被执行一遍

    执行下面的代码

    from ta_02_mode import input_password

    input_password()

    ta_02_mode中的代码

    def input_password():

        pwd = input("请输入密码")

        if len(pwd) >= 8:

            return pwd

        print("抛出异常")

        ex = Exception("密码长度不够")

        raise ex

    if __name__ == "__main__": # 通过这个判断,如果是导入则不执行下面的代码

        print("这是模块中执行的代码1")

    print("这是模块中执行的代码2") # 只要文件被运行,无论导入还是直接执行这段都会执行

    # 包(Package)操作

    ## 包的概念

    包是一个包含多个模块的特殊目录

    目录下有一个特殊的文件 __init__.py

    包的命名方式和变量名一致,小写字母+_

    ## 创建模块并导入案例:

    创建目录

    py_package

    创建__init__.py文件并在文件中写上

    from . import send_message # 导入需要定义给包调用的模块

    创建send_message.py模块文件并在文件中定义方法

    def send_msg():

    print("发送信息")

    在其他文件中引入包,并调用包中的方法

    import py_package

    py_package.send_message.send_msg() #调用方法

    ## 使用pip3包管理工具安装和卸载模块

    sudo pip3 install pygame

    sudo pip3 uninstall pygame

    # 使用python操作文件

    ## 读取文件内容

    file = open("README") # 打开文件

    text = file.read()  # 读取文件,read方法执行完后会将程序指针移动到文件末尾

    print(text)

    text = file.read()  # 再调用read由于指针已经移动到末尾,再次read读取不到文件

    print(text)  # 打印为空

    file.close()  # 关闭文件,注:打开文件后必须关闭文件,否则会一直占据内存

    ### 只读取一行文件内容

    file = open("README")

    file.readline() # 只读取一行文件内容,并将指针移动到下一行文件中

    ## 文件中写入内容的几种模式

    file = open("README", "r") # 只读模式

    file = open("README", "w") # 只写模式,写入内容并覆盖之前的内容

    file = open("README", "a") # 追加写入模式,在文件末尾写入内容

    ## 使用os模块进行目录管理

    ### 文件重命名

    os.rename(“hello.txt”,“123.txt”)

    ### 删除文件

    os.remove(“123.txt”)

    ### 创建目录名

    os.mkdir(“test”)

    # eval函数的使用

    对字符串进行计算:

    eval(“1+1”)  # 输出结果2

    将字符串转换为列表:

    type(eval(“[1,2,3,4,5]”))  # 输出list

    将字符串转换为字典:

    type(eval(“{‘name’: ‘name’, ‘age’: ‘18’}”))  # 输出dict

    ## 不要使用eval转换用户输入的input内容,因为代码命令都会执行

    比如目录操作代码 __import__(‘os’).system(‘ls’)等

  • 相关阅读:
    在C#中,不安装Oracle客户端如何连接Oracle数据库
    敏捷宣言(四) 猪和鸡的故事
    敏捷宣言(六) 单单有敏捷就够了吗?
    敏捷宣言(五) 看板是另外一种敏捷实践
    敏捷宣言(七) 软件系统
    小白知识摘录__进程和线程
    Linux系统修改/etc/sysconfig/i18n文件,桌面无法正常显示
    小白知识摘录__环境变量
    hive表查询中文显示乱码
    3月10日晚
  • 原文地址:https://www.cnblogs.com/Tabb/p/10840052.html
Copyright © 2011-2022 走看看