语法
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('你好,实例的静态方法')
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()
封装:隐藏对象中一些不希望外部访问到的一些属性,保证数据的安全性
#!/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)
在类中可以定义一些特殊的方法,称为魔术方法
特点
#!/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)
模块化是指将一个程序分解为一个个的模块module,通过组合模块来搭建一个完整的程序
优点:便于团队开发,方便维护、代码复用
在python中一个.py文件就是一个模块,创建模块实际上就是创建一个.py文件
注意
导入模块的两种方式
from 包名.模块名 import 变量、函数类
导入模块的代码可以放在任意位置,一般放在程序开头
python提供了一个强大的标准库,内置了许多非常有用的模块,可以直接使用
标准库随python一起安装
常用的内置模块:
#!/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)
Python社区提供了大量的第三方模块,使用方法与标准库类似
安装第三方模块
模块名
AttributeError:module 'pip' has no attribute 'main'
安装pycharts库 新版本pycharts默认不带地图文件,如果需要使用地图,需要自行安装地图文件包