0
点赞
收藏
分享

微信扫一扫

python-11-面对对象基础

上善若水的道 2022-04-06 阅读 138
python

01-uuid模块

# uuid用来生成一个全局唯一的id
import uuid

print(uuid.uuid1())  # 32个长度  每一个字符有16个选择  16**32
# print(uuid.uuid2())

# uuid3和uuid5是使用传入的字符串根据指定的算法算出来的,是固定的
print(uuid.uuid3(uuid.NAMESPACE_DNS, 'zhangsan'))  # 生成固定的uuid
print(uuid.uuid5(uuid.NAMESPACE_DNS, 'zhangsan'))  # 生成固定的uuid

print(uuid.uuid4())  # 使用的最多

02-使用第三方模块

# Python在查找模块的时候,在哪些路径下查找?

from flask import Flask
import sys

print(sys.path)

03-使用自定义模块

# 一个模块本质上就是一个py文件
# 自己定义一个模块,其实就是自己写一个py文件
# import 04-我的模块   如果一个py文件想要当做一个模块被导入,文件名一定要遵守命名规范
# 由数字、字母下划线组成,不能以数字开头

# 导入了一个模块,就能使用这个模块里变量和函数
import my_module

# 使用 from <module_name> import * 导入这个模块里"所有"的变量和函数
# 本质是读取模块里的 __all__ 属性,看这个属性里定义了哪些变量和函数
# 如果模块里没用定义 __all__ 才会导入所有不以 _ 开头的变量和函数
from demo import *

print(my_module.a)
my_module.test()
print(my_module.add(1, 2))

# 使用from demo import * 写法,不再需要写模块名
print(m)
test()

import demo

print(demo.n)

from hello import *

print(x)
print(y)
# print(_age)

import hello

# print(hello._age)

# hello._bar()
# print(hello.x)

# import datetime
# datetime._is_leap(2000)

04-包的使用

# 可以将多个具有相似或者有关联的多个模块放到一个文件夹里,便于统一管理
# 这个文件夹,我们就可以称之为包
# python包里,会有一个 __init__.py 文件

from chat import recv_msg
from chat.send_msg import x
import json
import flask

import chat

print(recv_msg.y)
print(x)
print(chat.recv_msg.y)

05-面向过程

def add_user():
    pass


def del_user():
    pass


def modify_user():
    pass


def query_user():
    pass


def show_all():
    pass


def start():
    while True:
        print("""---------------------------
        名片管理系统 V1.0
    1:添加名片
    2:删除名片
    3:修改名片
    4:查询名片
    5:显示所有名片
    6:退出系统
    ---------------------------""")
        operator = input('请输入要进行的操作(数字)')
        if operator == '1':
            add_user()
        elif operator == '2':
            del_user()
        elif operator == '3':
            modify_user()
        elif operator == '4':
            query_user()
        elif operator == '5':
            show_all()
        elif operator == '6':
            pass
        else:
            print('输入有误,请重新输入......')


if __name__ == '__main__':
    start()

06-面向对象的基本语法

# 小明今年 18 岁,身高 1.75,每天早上跑完步,会去 吃 东西
# 小美今年 17 岁,身高 1.65,小美不跑步,小美喜欢 吃 东西

# 定义类:类名怎么定义? 使用 class 来定义一个类
# class 类名:类名一般需要遵守大驼峰命名法,每一个单词的首字母都大写
# 1. class <类名>:
# 2. class <类名>(object):


class Student(object):  # 关注这个类有哪些特征和行为
    # 在 __init__ 方法里,以参数的形式定义特征,我们称之为属性
    def __init__(self, name, age, height):
        self.name = name
        self.age = age
        self.height = height

    # 行为定义为一个个函数
    def run(self):
        print('正在跑步')

    def eat(self):
        print('正在吃东西')


# 使用 Student 类创建了两个实例对象 s1 s2
# s1和s2都会有name,age,height属性,同时都有run和eat方法
s1 = Student('小明', 18, 1.75)  # Student() ==> 会自动调用 __init__ 方法
s2 = Student('小美丽', 17, 1.65)

# 根据业务逻辑,让不同的对象执行不同的行为
s1.run()
s1.eat()

s2.eat()

07-self语句的使用

class Student(object):
    # 这个属性直接定义在类里,是一个元组,用来规定对象可以存在的属性
    __slots__ = ('name', 'age', 'city')

    def __init__(self, x, y):
        self.name = x
        self.age = y

    def say_hello(self):
        print('大家好,我是', self.name)


# Student('张三',18) 这段代码具体做了什么呢?
# 1. 调用 __new__ 方法,用来申请内存空间
# 2. 调用 __init__ 方法传入参数,将 self 指向创建好的内存空间,填充数据
# 3. 变量 s1 也指向创建好的内存空间
s = Student('张三', 18)

print(s.name)
s.say_hello()

# 没有属性,会报错
# print(s.height)

# 直接使用等号给一个属性赋值
# 如果这个属性以前不存在,会给对象添加一个新的属性
# 动态属性
s.city = '上海'  # 给对象添加了一个city属性
print(s.city)

# 如果这个属性以前存在,会修改这个属性对应的值
s.name = 'jack'
print(s.name)  # jack

08-魔术方法

# 魔法方法,也叫魔术方法,是内里的特殊的一些方法
# 特点:
# 1.不需要手动调用,会在合适的时机自动调用
# 2. 这些方法,都是使用 __ 开始,使用 __ 结束
# 3. 方法名都是系统规定好的,在合适的时机自己调用
# import datetime
#
# x = datetime.datetime(2020, 2, 24, 16, 17, 45, 200)
# print(x)  # __str__ 方法
# print(repr(x))  # __repr__ 方法


class Person(object):
    def __init__(self, name, age):
        # 在创建对象时,会自动调用这个方法
        print('__init__方法被调用了')
        self.name = name
        self.age = age

    def __del__(self):
        # 当对象被销毁时,会自动调用这个方法
        print('__del__ 方法被调用了')

    def __repr__(self):
        return 'hello'

    def __str__(self):
        return '姓名:{},年龄:{}'.format(self.name, self.age)

    def __call__(self, *args, **kwargs):
        # print('__call__ 方法被调用了')
        # args = (1, 2, 4, 5),kwargs = {'m':'good', 'n':'hehehe', 'p':'heiheihei'}
        print('args={},kwargs={}'.format(args, kwargs))


p = Person('zhangsan', 18)

# 如果不做任何的修改,直接打印一个对象,是文件的 __name__.类型 内存地址
# print(p)  # <__main__.Person object at 0x00000217467AEA08>

# 当打印一个对象的时候,会调用这个对象的 __str__ 或者 __repr__ 方法
# 如果两个方法都写了,选择 __str__
print(p)

# print(repr(p))  # 调用内置函数 repr 会触发对象的 __repr__ 方法
# print(p.__repr__())  # 魔法方法,一般不手动的调用

p(1, 2, 4, 5, m='good', n='hehehe', p='heiheihei')  # 对象名() ==> 调用这个对象的 p.__call__() 方法

09-__eq__方法介绍

class Person(object):
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __eq__(self, other):
        # print('__eq__方法被调用了,other=', other)
        # if self.name == other.name and self.age == other.age:
        #     return True
        # return False
        return self.name == other.name and self.age == other.age


p1 = Person('zhangsan', 18)
p2 = Person('zhangsan', 18)
p3 = Person('zhangsan', 19)

# p1 和 p2 是同一个对象吗?
# 怎样比较两个对象是否是同一个对象?比较的是内存地址
print('0x%X' % id(p1))  # 0x20CE2A8EE88
print('0x%X' % id(p2))  # 0x20CE2A8EF08

# is 身份运算符 可以用来判断两个对象是否是同一个对象
print('p1 is p2', p1 is p2)  # False

# __eq__ 如果不重写,默认比较依然是内存地址
print('p1 == p2', p1 == p2)  # p1 == p2本质是调用 p1.__eq__(p2),获取这个方法的返回结果
print(p1 == p3)

# is 比较两个对象的内存地址
# == 会调用对象的 __eq__ 方法,获取这个方法的比较结果
# nums1 = [1, 2, 3]
# nums2 = [1, 2, 3]
# print(nums1 is nums2)  # False
# print(nums1 == nums2)  # True

10-一些demo

__all__ = ['m', 'test']
m = 'yes'
n = 100


def test():
    print('我是demo模块里的test方法')


def foo():
    print('我是demo模块里的foo方法')


def division(a, b):
    return a / b


# __name__:当直接运行这个py文件的时候,值是__main__
# 如果这个py文件作为一个模块导入的时候,值是文件名
if __name__ == '__main__':
    print('demo里的name是:', __name__)
    print('测试一下division函数,结果是:', division(4, 2))
# 没有设置 __all__ 会读取除了以_开始的所有变量和函数
x = 'hello'
y = 1000

# 以一个下划线开始变量,建议只在本模块里使用,别的模块不要导入
_age = 19  # 使用from 模块名 import * 这种方式无法导入
_age += 1


def _bar():
    print('我是hello里的bar函数,我只能hello文件内部使用')


del (_age, _bar, x)
a = 'hello'


def test():
    print('我是my_module模块里的test函数')


def add(x, y):
    return x + y
举报

相关推荐

0 条评论