Python之对像和模块

五、面向对象

1.定义类

语法
class 类名:
类中成员
类中的成员:实例属性、实例方法、类属性、类方法、静态方法等

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
__author__ = '陈爽'


# 定义一个类,使用class关键字
class Student:
    # pass
    # 直接在类中定义类属性,可以通过类或实例对象来访问
    hobby = '吃饭'

    # 实例方法:将self作为第一个参数的方法
    def say_hi(self):  # self表示当前类的实例,类似于java中的this
        print('hi' + self.name)

    def say_hello(self, username='无名氏'):
        print('Hello' + username)

    # 类方法:使用@classmethod修饰的方法,将cls作为第一个参数
    @classmethod
    def show(cls, msg):  # cls表示当前类
        print(msg,cls.hobby)

    # 静态方法:使用@staticmethod修饰的方法,没有任何必选参数,不需要将cls作为第一个参数
    @staticmethod
    def show2(msg):
        print(msg, Student.hobby)




# 创建类的对象
stu1 = Student()  # 创建Student类的一个实例
stu2 = Student()
print(stu1, type(stu1))

a = 3
print(a, type(a))
b = int(5)
c = str('hello')
print(c, type(c))

# 为对象绑定属性
stu1.name = 'tom'
stu1.age = 12
stu2.name = 'alice'
stu2.sex = 'female'
print(stu2.sex, stu2.name)
print(stu1.age, stu2.name)
# 访问实例方法
stu1.say_hi()  # 调用方法时无需传递self参数,由解析器调用时自动将对象作为self传入
stu2.say_hello('张三')
stu2.say_hello()

# 访问类的属性
print(Student.hobby)
stu1.hobby = 'hobby'  # 为stu1添加了一个实例属性,并不会改变hobby的值
print(stu1.hobby)
print(stu2.hobby)  # 如果当前实例没有hobby属性,则会向上查找类属性hobby

# 访问类方法
Student.show('hellooooo')  # 调用方法时无需传递cls
stu1.show('echooooooo')

# 访问静态方法
Student.show2('你好,静态方法')
stu1.show2('你好,实例的静态方法')

2.构造方法

init()构造方法,在创建对象时会自动调用,可以用来初始化对象的属性

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
__author__ = '陈爽'


class Student:

    # 构造方法(函数),不支持重载
    def __init__(self, name, age):
        print('创建对象,执行构造方法')
        self.name = name
        self.age = age

    # 实例方法
    def show(self):
        print('姓名:%s, 年龄:%d' % (self.name, self.age))


stu = Student('tom', 19)
print(stu.name, stu.age)
stu.show()

3.封装、继承、多态

封装:隐藏对象中一些不希望外部访问到的一些属性,保证数据的安全性

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
__author__ = '陈爽'

class  Student:
    # 定义私有属性
    __age__ = 18  # 以两个下划线开头,表示对象的隐藏属性,只能在类内部访问

    # 提供getter和sette方法
    def get_age(self):
        return self.__age

    def set_age(self, age):
        # 判断数据是否有效
        if 0 < age <100:
            self.__age = age
        else:
            self.__age = 18


stu1 = Student()
# print(stu1.get_age())  # 在类外部无法访问私有属性
stu1.set_age(28)
print(stu1.get_age())

# 其实python会把私有属性转为_类名__属性名(强烈不建议)
print(stu1._Student__age)

继承:使一个类能获取到其他类中的属性和方法

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
__author__ = '陈爽'


# 定义一个Person类,父类(超类,基类)
class Person:
    def __init__(self, name):
        self.name = name

    def run(self):
        print('person:' + self.name + '正在奔跑')


# 定义一个Student,子类
class Student(Person):  # 继承自Person
    # 调用父类构造方法
    def __init__(self, name, email):
        # Person.__init__(self,name)  # 方式1.直接指定父类的构造方法
        super().__init__(name)  # 方式2.使用super推荐
        self.email = email

    # 定义子类特有的方法
    def study(self):
        print('student:' + self.name + '正在学习。。。')

    def show(self):
        print('姓名:%s ,邮箱:%s' % (self.name, self.email))

    # 重写父类的方法
    def run(self):
        # super(Student, self).run()  # 调用父类方法
        print('student:' + self.name + '正在奔跑。。。')


stu = Student('tom', '[email protected]')
stu.run()  # 调用子类重写后的方法
stu.study()
stu.show()

# 判断一个对象是否是指定类的实例,即判断对象的类型
print(isinstance(stu, Student))
print(isinstance(stu, Person))

# 判断一个类是否为指定类的子类
print(issubclass(Student, object))
print(issubclass(Student, Person))

# object类是所有类的根类,默认所有类都继承于object
print(stu.__doc__)
print(stu.__dict__)

多继承

class A:
    def a(self):
        print('a')


class B:
    def b(self):
        print('b')


class C(A, B):
    def c(self):
        print('c')


c = C()
c.a()
c.b()
c.c()

# 类的特殊性 __bases__ 可以用来获取当前类的所有父类
print(C.__bases__)

多态:多种形态

#!/usr/bin/env python3
# -*- coding:utf-8 -*-
__author__ = '陈爽'


class Animal:
    def __init__(self, name):
        self.name = name

    def cry(self):
        print('动物在叫....')


class Dog(Animal):
    def __init__(self, name, age):
        super().__init__(name)
        self.age = age

    def cry(self):
        print('狗在叫。。。。汪汪汪')


class Cat(Animal):
    def __init__(self, name, sex):
        super().__init__(name)
        self.sex = sex

    def cry(self):
        print('猫在叫。。。喵喵喵')


# 一个对象可以以不同的形式去呈现
def play(animal):
    print(animal.name)
    animal.cry()


dog = Dog('旺财', 2)
cat = Cat('咪咪', '公')

play(dog)
play(cat)

4.魔术方法

在类中可以定义一些特殊的方法,称为魔术方法
特点

  • 都是以双下划线开头,以双下划线结尾
  • 不需要手动调用,在特定时机会自动执行
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
__author__ = '陈爽'


# 定义一个类
class Person(object):

    def __init__(self, name, age):
        print('__init__')
        self.name = name
        self.age = age

    # 将对象转换为字符串时调用,类似于java中的toString()
    def __str__(self):
        return  'Person [name=%s, age=%d]' % (self.name, self.age)

    # 在对象使用len()函数时调用
    def __len__(self):
        return len(self.name)

    # 在对象使用repr()函数时调用
    def __repr__(self):
        return 'hello person'

    # 在对象转换为bool类型时调用
    def __bool__(self):
        return self.age > 18

    # 在对象进行大于比较时调用
    def __gt__(self, other):
        return self.age > other.age


p1 = Person('tom', 23)
p2 = Person('alice', 22)

print(p1)

print(len(p1))
print(repr(p1))
print(bool(p1))
if p1:
    print(p1.name, '已成年')
else:
    print(p1.name, '未成年')
print(p1 > p2)

六、模块

1.简介

模块化是指将一个程序分解为一个个的模块module,通过组合模块来搭建一个完整的程序
优点:便于团队开发,方便维护、代码复用
在python中一个.py文件就是一个模块,创建模块实际上就是创建一个.py文件

注意

  • 自定义模块时要注意命名规范,使用小写,不要使用中文、特殊符号等
  • 不要与内置模块冲突

2.使用模块

导入模块的两种方式

  • 方式1:import 包名.模块名[as 别名]
  • 方式2:from 包名 import 模块名
  •  		from 包名.模块名 import 变量、函数类
    

导入模块的代码可以放在任意位置,一般放在程序开头

2.python标准库

python提供了一个强大的标准库,内置了许多非常有用的模块,可以直接使用
标准库随python一起安装

常用的内置模块:

  • sys:获取python解析器信息
  • os:对操作系统进行访问,主要是对目录和文件进行操作
  • math:数学运算
  • random:产生随机数
  • datetime:处理日期和时间,提供了多个类
  • time:处理时间
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
__author__ = '陈爽'

import sys
import os
import math
import time
from datetime import datetime, timedelta
import random
# import py03_面向对象.module
# print(py03_面向对象.module.a)  # 调用模块中的变量
# print(py03_面向对象.module.plus(3, 5))  # 调用模块中的函数
# 方式1. import 包名.类名
# import py03_面向对象.module as m
#
# print(m.a)
# print(m.plus(2, 2))
# 方式2. from 包名 import 模块名
# from py03_面向对象 import module
# from py03_面向对象.module import minus  # 用啥写啥
# from py03_面向对象.module import *  # 不建议

print(sys.version)  # python版本
print(sys.platform)  # 系统平台
print(sys.argv)  # 命令行参数
print(sys.path)  # 模块搜索路径,包含了python解析器查找模块的搜索路径
print(sys.modules)  # 显示当前程序引入的模块
print(sys.getdefaultencoding())  # 默认的字符集
# sys.exit('程序退出')  # 退出解析器
print('*' * 80)

print(os.name)  # 操作系统的类型
print(os.environ['path'])  # 系统的环境变量
print(os.getcwd())  # 当前的目录
print(os.listdir('f:/'))  # 列出指定目录的内容
print(os.path.exists('f:/Servers'))  # 判断当前路径是否存在
# os.system('ping www.baidu.com')  # 执行系统命令
# os.system('ipconfig')
print('*' * 80)

print(math.pi)
print(math.ceil(3.4))
print(math.floor(3.8))
print(math.pow(2, 3))
print(math.trunc(2.7))  # 截尾取整
print(math.floor(-3.4))
print(math.trunc(-3.4))
print(round(2.6))
print(round(3.1415926, 3))  # 四舍五入,保留三位小数
print('*' * 80)

print(random.random())  # 返回[0,1)之间的随机浮点数
print(random.randint(1, 101))  # 返回[1,100]之间的整数
print(random.sample([1, 21, 54, 23, 6, 2], 2))  # 从数组中随机返回两个元素
print('*' * 80)

print(datetime.now(), type(datetime.now()))  # 获取当前时间 
print(datetime.today())
print(datetime.strftime(datetime.now(), '%Y-%m-%d %H:%M:%S'))  #将datetime转换为指定格式字符串
print(datetime.strftime(datetime.now(), '%Y{0}%m{1}%d{2} %H:%M:%S'.format('年', '月', '日')))
print(datetime.strptime('2021-2-14', '%Y-%m-%d'))  # 创建指定日期 字符串解析parse成日期
print('明天:', datetime.now() + timedelta(days=1))  # timedelta表示两个时间之间的时间差,可以用来进行日间的加减操作
print('前一小时:', datetime.now() - timedelta(hours=1))
print('================================')

print(time.time())  # 返回当前时间的时间戳 s
print(int(time.time()))  # 秒级时间戳 取整
print(int(time.time() * 1000))  # 毫秒级时间戳
time.sleep(5)  # 休眠5s
print(111)

4.第三方模块

Python社区提供了大量的第三方模块,使用方法与标准库类似
安装第三方模块

  • 使用包管理工具pip(随Python一起安装)
    pip install 模块名
  • 使用pyCharm来安装
    Settings---->Project------>Project Interpreter
    报错:AttributeError:module 'pip' has no attribute 'main'
    解决:关闭pycharm,找到其安装目录–>bin/helpers/packing_tools.py–>do_install和do_uninstall有问题
    注:官方仓库比较慢,可以使用豆瓣提供的镜像仓库
    https://pypi.python.org/simplehttp://pypi.douban.com/simple
    pyecharts是一个用于Echarts图表的类库,便于在Python中根据数据生成可视化的图表
    参考:http://pyecharts.org
    Echarts是百度开源的一个数据可视化JS库,主要用来进行数据可视化。

安装pycharts库 新版本pycharts默认不带地图文件,如果需要使用地图,需要自行安装地图文件包

你可能感兴趣的:(Python之对像和模块)