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’)等

原文地址:https://www.cnblogs.com/Tabb/p/10840052.html