这是python基础语法的最后一期啦,主要讲解的是类,以及方法这些定义。两周前就差不多跟着学完了,但是一直没时间去更新。最近在学习opencv和pyautogui;
一、方法的定义:
# 介绍:方法的定义
def sum(a, b):
print('a=', a)
print('b=', b)
return a + b
# 这种应该都看的懂就是和java一样的
print(sum(10, 20))
# 和java不同的是,他可以再调用的时候安装参数名称去赋值,而不是先后顺序。
# 下面这种调用很明显打印的是
# a= 20
# b= 10
# 30
print(sum(b=10, a=20))
# 方法参数传递中,如果是不可变对象就是直接传递的值(也就是无法在方法中修改),如果是可变对象就是地址值是可以在方法中修改的
# 这点和java类似,就不多讲解,在方法中修改了第一个参数的值但是方法结束后还是打印的20,第二个参数列表反而多了一个参数
def fun(a, b):
a = 10
b.append(10)
c = 20
d = [10, 20, 30]
fun(c, d)
print(c)
print(d)
# 返回值传递一个列表,区分列表的奇偶
def fun1(a):
js = []
os = []
for item in a:
if item % 2:
js.append(item)
else:
os.append(item)
return os,js
# 返回多个值的时候是会返回一个元组
print(fun1([i for i in range(0, 11)]))
# 方法的默认值:如果每日传递参数则a就等于1
def fun2(a=1):
pass
# 方法传递可变参数,*arg1代表的是元组,arg2代表的是字典结构的;*arg1只能同时存在一个,**arg2也是同时只能存在一个,但是两个可以共存
def fun3(*arg1,**arg2):
pass
不过多讲解,个人的看法全都在代码注释中。
二、异常处理语句:
# 介绍:异常处理语句,这个import就是导入,和java的导包差不多
import traceback
try:
a=int(input('输入第一个数字'))
b=int(input('输入第二个数字'))
result=a/b
except ValueError as e:
traceback.print_exc()
print('不可以输入除数字以外的',e)
except ZeroDivisionError as e:
traceback.print_exc() #这个是可以将报错信息打印出来,方便我们知道什么位置报错
print('被除数不能为0',e)
else:
#没出先异常就会执行下面的语句
print('计算结果为:',result)
finally:
print('无论是否异常都会执行')
三、类
# 介绍:类
class Student:
# 类的属性,给了默认值,属于实例对象的属性
school='lisi'
# 类似java的构造方法,创建的时候可以赋值
def __init__(self,name,age):
self.__home='a' #属性或方法在前面加__,代表属性或者方法只能在类中访问,
self.name=name
self.age=age
# 实例方法
def study(self):
print(self.name,'在好好学习')
# 类方法
@classmethod
def run(cls):
print('pao')
# 静态方法
@staticmethod
def sleep():
print('在睡觉')
stu=Student('lisi',18)
stu.study()
# 等同上面的调用
Student.study(stu)
# 对象也可以调用类的了方法和静态方法
stu.run()
stu.sleep()
stu.gender='nv'
# 动态属性,只属于这个对象的,其他对象没有,也可以绑定方法
print(stu.gender)
def fun():
print('zaiwan')
stu.fun=fun()
stu2=Student('aaa',1)
print(stu2.school)
print(stu.name)
四、模块的引入,关于这个只有一个需要注意的:如果你在python文件a中导入oython文件b(都是你自己写的),然后执行文件a,这时候文件b的代码块也会执行,如果需要避免就要将文件b中的代码块改到main方法中,如下:
class Student:
def __init__(self,name,age):
self.name=name
self.age=age
def __str__(self):
return 'name={0},age={1}'.format(self.name,self.age)
def fun1():
print('等到导入的方法')
if __name__ == '__main__':
#如果下面的这行不写在这个main下面就会直接执行
print('等待导入的包')
五、继承,重写
# 介绍:类的继承,重写
class Person(object): #代表继承object类,不写代表默认继承这个类,类中有__str__方法,重写方法就可以不打印地址打印重写方法返回值,类似java的tostring
def __init__(self,name,age):
self.name=name
self.age=age
def intro(self):
print('我叫',self.name,'年龄',self.age)
class Student(Person):
def __init__(self,name,age): #将属性赋值给父属性,副属性方法用super调用
super().__init__(name,age)
def intro(self): #重写父的方法,直接重写即可,不需要加@override
super().intro()
print('正在学习')
class Teacher(Person):
def __init__(self,name,age):
super(Teacher, self).__init__(name,age)
def intro(self):
super(Teacher, self).intro()
print('正在教书')
stu1=Student('张三',15)
stu1.intro()
tea1=Teacher('liu',34)
tea1.intro()
六、多态
# 介绍:多态(感觉没有java的多态多态),object的方法
class Animal:
def eat(self):
print('动物吃')
class Dog(Animal):
def eat(self):
print('狗吃')
class Cat(Animal):
def eat(self):
print('猫吃')
class People:
def __init__(self,age):
self.age=age
def eat(self):
print('ren')
def __add__(self, other):
return self.age+other.age
# 没感觉多态的原因是因为没有数据类型,参数是可以是任意类型,只要参数有对于的方法属性就可以了
def fun(animal):
animal.eat()
cat=Cat()
dog=Dog()
p=People(1)
fun(cat)
fun(dog)
fun(p)
# 如果想要object对象可以相加重写类的 __add__方法就好了
p2=People(3)
p3=People(4)
print(p2+p3)
# 列表等是有长度的len(lst),入过想要对象也有长度可以重写__len__方法
还有个小demo一个管理系统,感觉对于从java转到python的人来说没什么必要去看那个了。下周有空会更新opencv和pyautogui。python也有许多自带的方法,这里就不一一详解,推荐给大家几个网站自行查看就好了。
关于requests认证使用官方文档:
https://requests-oauthlib.readthedocs.io/en/latest/
python3内置函数API
https://docs.python.org/3/library/functions.html
第3方requests包函数的API
https://docs.python-requests.org/zh_CN/latest/
https://docs.python-requests.org
python3标准库API
https://docs.python.org/3/library/