.......................类1..............................
#Python是面向对象的编程语言,面向对象的特点,继承,封装,多态
#面向对象编程:和面向过程一样,是一种编程思想
#类:具有相同属性和行为方法的事物的抽象的集合,类的例子:人类、猴
类、鱼类;人类的属性:身高、体重。。人类的行为:吃喝拉撒睡,
#对象:;类的具体的实例化
#人类中的对象:马云、马化腾、丁三石
#类的作用:创建对象 一般会在类中定义一些属性和函数,当时用类创建
对象的时候,该对象会拥有类中定义的这些属性和函数
#类中的一些属性和函数,是由所有的对象身上共同的属性和行为抽离出来
的
#对象的作用:实现函数和属性的调用执行的
#在Python中声明一个类:class:班级群体
#object 继承的父类 object基类、顶级父类
d1={'name':'张三','age':'22','phone':'110'}
d2={'name':'李四','age':'23','phone':'120'}
student_list=[d1,d2]
# print(student_list)
class People(object):
#pass 保证语法完整性
#pass
#例如:人出生时,已经包含了性别,体重等属性
#__init__(self)初始化函数 。类中内置函数,,在创建对象时自动
调用
def __init__(self,name,age,phone):
# print('.......')
#在这个函数中需要将创建对象时就应该拥有的一些属性赋值
#对象.属性名=属性值
self.name=name
self.age=age
self.phone=phone
#使用people类创建一个对象,创建对象的基本格式:对象名=类名()
#当创建一个对象时,会在内存中开辟一块空间,来存放这个对象,这个对
象是由一个地址的,每次创建的对象都是一个单独的个体,他们的内存地址
都不一样
#p1不是对象,是一个指针,通过指针找到对象;People()是对象
p1=People('张三','22','110')
#输出结果:<__main__.People object at 0x000000000104C080>
#0x000000000104C080内存地址
#内存:程序运行时,在计算机中占用的空间
#Python中是自动管理内存的
#电脑上的500G这种是硬盘空间(存储空间)
#print(p1)
#p2=People()
#print(p2)
#获取一下对象的属性值:对象.属性名
name=p1.name
age=p1.age
phone=p1.phone
print(name,age,phone)
#修改对象的属性值:对象.属性名=属性值(此时该属性已经存在)
p1.name='李四'
print(p1.name)
#Python中用来设置对象属性值的函数
#三个参数:1.要设置属性值的对象2.要设置的属性名3.要设置的属性值
setattr(p1,'age','25')
print(p1.age)
#可以给对象添加新的属性:对象.属性名=属性值,,,如果这个属性不存在
,就是添加属性
p1.sex='男'
print(p1.sex)
#再给对象添加属性时,给那个添加,哪个有该属性,但是其他对象并没有
噶属性
# p2=People('王五',23,120)
# print(p2.sex)
#删除对象属性:del 对象.属性名
del p1.sex
#对象的属性被删除之后,就不能再用了
#当删除的属性不存在时会报错:AttributerError
#删除对象属性的函数
#两个参数:1.要删除的对象2.要删除的属性名
delattr(p1,'phone')
#删除之后,就不能再利用这个属性了
#print(p1.phone)
#setattr函数动态添加或者修改属性
attr_dict={'iq':'150','eq':'150','color':'yellow'}
#for循环遍历字典
for key,value in attr_dict.items():
#key是属性名,value是属性值
#p1.key=value这种方法无法添加,因为相当于:p1.'iq'='150'
#需要利用setattr函数,可以将一个字符串的属性名添加到对象的属性
中
setattr(p1,key,value)
print(p1.iq)
#动态删除对象的属性
attr_list=['iq','eq','color']
for attr in attr_dict:
#可以使用delattr函数删除
delattr(p1,attr)
#对象属性删除之后,不可再用
#print(p1.attr)
........................类2...................................
# -*- coding:utf-8 -*-
#类属性、类变量:只能由类调用的属性
class People(object):
#类变量可以由所有的对象访问,但是对象只能访问不能修改,类变量
可以用来做资源共享
#total,name1为类属性
total=0
#name1='python8'
#初始化函数,添加对象属性
def __init__(self,name,age,school):
#给对象属性赋值
self.name=name
self.age=age
self.school=school
#只能使用类名去修改类变量的值
People.total+=1
#创建对象
#p1和p2是两个不同的对象,这两个对象各自的信息是不可以共享的
p1=People('娄**',21,'郑州电力职业技术学院')
print(People.total)
p2=People('韩**',22,'河南理工大学')
print(p1.name)
print(People.total)
#类调用类属性
#print(People.name1)
#类无法访问对象实例属性,
#print(People.name)
#对象实例可以访问类属性或者类变量
# print(p1.total)
#对象没有办法修改类属性的值
#相当于给p1对象添加了一个total属性
p1.total=100
print(People.total)
#如果需要修改类变量 的值,只能由类调用修改
# People.total=10000
# print(People.total)
#若对象没有total属性,此时输入的是类对象修改之后的值
# print(p1.total)
p3=People('张三',23,'智游')
#。。。。。获取对象的属性值
#方法一:
name=p3.name
print(name)
#如果没有该属性,会报错
# name=p3.ssss
# print(name)
#方法二:
#使用getattr(object,name,default)函数
#三个参数含义:object:要获取属性的对象;name 要获取的属性名 ;
default 当属性不存在时,赋一个默认值
age=getattr(p3,'age',30)
print(age)
#当属性不存在时,使用该方法不会报错,会给一个默认值
#hasattr(object,name)判断某个对象是否拥有某个属性
#判断会返回结果,如果有这个属性返回Ture,没有返回False
s=hasattr(p3,'age')
print(s)
#先判断是否有这个属性,再执行获取属性值的操作
if hasattr(p3,'ssss'):
s=p3.ssss
else:
print('p3没有ssss这个属性')
........................类3...................................
# -*- coding:utf-8 -*-
#对象实例函数
class People(object):
#关于初始化函数,如果需要在创建对象的时候,给对象属性赋值,就
可以在初始化函数中传递参数,给属性赋值;如果不需要初始化对象属性值
,就不用写初始化函数了
def __init__(self):
#初始化函数可以不用传递参数值,可以直接给属性赋一个默认值
self.name='张三'
self.age=20
#凡是在类中定义的函数,如果定义函数前,没有添加装饰器,这个函
数默认为对象函数,只能由对象去调用执行 ,类也可以执行该函数,但是
在调用时必须将一个Peopele类的对象作为参数进行传递,也就是说,无论
是谁调用,都必须要有一个对象
def eat(self):
# self参数不需要手动传递,在运行Python程序时,解释器会自
动将调用函数的对象作为self参数进行传递
#self指的是:对象A调用这个函数,self就是对象A;对象B调用这
个函数,self就是对象B
#输出self
print(self)
def look_movie(self,name,price=29,*args,**kwargs):
print(name,price,args,kwargs)
# #此时p1有默认值
p1=People()
print(p1.name)
#修改属性值
# p1.name='张三丰'
# print(p1.name)
p1=People()
#对象调用函数
p1.eat()
print('p1: %s'%p1)
print('************')
p2=People()
p2.eat()
print('p2: %s'%p2)
#如果使用类调用对象函数,必须将一个对象作为参数传入函数中
#把p1当做对象
People.eat(p1)
#p1调用多参数函数
p1.look_movie('前任3',39,1,50,drink='coco',
eat='boomflower')
.................类4.私有属性.......................
# -*- coding:utf-8 -*-
#对象的私有属性
class People(object):
"""description可以写一些类的描述"""
def __init__(self,name):
self.name=name
#声明一个对象的私有属性
#私有属性只能在类声明的范围内使用,
#声明私有属性,需要在属性名前加__双下划綫
self.__age=18
#一个下划线不是私有属性
self._height=180
#如果想要在类声明的外部获取私有属性的属性值,专门写一个函数,
在函数中将私有属性值返回,在类声明外部就可以调用这个函数获取私有属
性,获取__age的属性值
def get_age(self):
#print(self.__age)
#返回__age的属性值
return self.__age
# 如果想要在类声明的外部获取私有属性的属性值,专门写一个函数,
在函数中对私有属性值赋值,在类声明外部就可以调用这个设置私有属性,
修改_age的属性值
def set_age(self,value):
#类声明的范围内,可以放私有属性
self.__age=value
p1=People('张三')
print(p1.name)
#一个下划线不是私有属性,可以在外部访问
print(p1._height)
#超出声明的范围,所以这个位置是无法访问__age属性值的,在外部调用会
报错
#print(p1.__age)
#通过调用get_age函数,获取__age值
age=p1.get_age()
print(age)
#在类声明的外部,无法直接修改私有属性值
#p1.__age=20
#调用set_age函数
p1.set_age(20)
age=p1.get_age()
print(age)
*****************变量作用域****************************
#作用域:(变量能使用的范围)一个变量产生作用的范围,在哪一个范围
内可以被使用
#作用域分为两种:全局变量作用域 局部变量作用域
#全局变量:一般在函数或者代码块外部声明的变量(声明时要顶格写),
作用域范围,从声明的位置开始往下,一直到文件末尾都可以使用
#局部变量:一般在函数内部或者代码块内部声明的变量,被称为局部变量
,这类变量只能在函数或者代码块内部使用,超出范围则不可使用
#全局变量
a=100
#局部
def eat():
#这个变量c作用范围在函数内部
c=10
print(c)
rs=eat()
#print(rs)
#全局变量如何在函数内部进行赋值操作
name='张三'
#默认情况下,如果全局变量的名称和局部变量的名称相同,例如:都是
name,局部变量会将这个全局变量覆盖(即函数中是局部变量)
def change_name():
#如果不使用globle引用全局变量,是可以获取这个全局变量的值
s=name
#但是不能修改全局变量值,一旦修改,相当于创建一个和全局变量重
名的局部变量
#当想要在函数中改变全局变量 global:全局 ,引用一个全局变量,
避免出现一个和全局变量重名的局部变量
# global告诉这个函数,在函数内部使用name变量是一个全局变量
global name
name='李四'
# print(name)
change_name()
print(name)
*************************异常捕获*************************
# -*- coding:utf-8 -*-
#try ..... except......用于异常捕获,当一段代码程序执行时出现异常
(报错),会导致整个程序结束,出现异常的地方之后的逻辑代码就不会执
行了,所以需要捕获异常,当捕获到异常之后,可以对异常进行处理。处理
完成之后,可以保证项目中的其他代码不会受影响
try:
print(name)
except Exception as e:
print('............',e)
print('=====================')
list1=[1,2]
try:
s=list1[4]
except Exception as e:
#Exception所有错误类型的基类
'''
错误类型
1.IndexError 索引错误
1.NameError 名称错误
1.ValueError 值错误
1.KeyError 键错误
5.ImportError 引用错误
'''
print('索引越界')
#如果出现异常,可以在这个代码块写处理异常的方案
# 取出最后一个
s=list1.pop()
print(s)
print('****************')
#捕获指定类型的异常,只能捕获指定的类型,此时若有其他类型错误,则仍
会报错
try:
import ssss
print(name)
except (ImportError,NameError) as e:
#可以指定只捕获的一类,也可以捕获多种,用括号括起来
print(e)
#try....except.......else...
# 如果代码块出现异常执行except后的代码块,没有出现异常,执行else里
后的代码块
try:
print('123456')
except Exception as e:
print(e)
else:
#没有出现异常会执行else中的代码块
print('try中的代码没有出现异常错误')
#自定义触发异常
#使用场景:如果需要达到某种条件才能执行,否则抛出异常,可以使用
raise触发自定义的异常
def test(age):
if age<16:
#raise触发异常,自己设置的异常 :Exception(异常)
raise Exception('小于16岁,禁止使用童工!')
else:
print('录用!')
# test(15)
#捕获自定义异常
try:
test(15)
except Exception as e:
print('...........%s'%e)
test(16)
#try.....except.....else.....finally,,,
#finally后的代码块,无论是否异常,都会执行这个代码块
#例如:读写数据,无论读写是否成功,都需要把关闭文件,这个关闭文件
的操作就可以放在finally代码块中
try:
#检测的代码
print(name)
except Exception as e:
#捕获到异常执行的代码
print(e)
else:
#没有异常执行的代码
print('没有出现异常')
finally:
#无论是否出现异常,都会执行的代码
print('**********')
**************************排序**********************
# -*- coding:utf-8 -*-
#..................注意:该课件在2.7版本中运行.............
#..................注意:该课件在2.7版本中运行.............
#..................注意:该课件在2.7版本中运行.............
#sorted()函数 可以对数字(从小到大或者从大到小)或者字符串(按照
ASCII编码)进行排序
#对数字进行排序,默认按照升序排序
#列表还可以利用sort()函数队列表进行排序
list1=[4,85,75,12,0,54,32,15]
#方法一:该方法不能用一个变量接收,否则会输出none
list1.sort()
print(list1)
#方法二:
rs=sorted(list1)
print(rs)
list1=[4,85,75,12,0,54,32,15]
#实现一个按照降序排序的函数
#如果x>y,返回-1,x<y 返回1,是按照降序排序,
#如果x>y,返回1,x<y返回-1,按照升序排列
def reversed(x,y):
if x>y:
return -1
if x<y:
return 1
return 0
rs=sorted(list1,reversed)
print(rs)
list2=['f','t','r','u','r','p','w']
rs=sorted(list2)
print(rs)
#如果需要实现字符串的排序,忽略大小写,只按照小写的a-z进行排序
list3=['if','With','BOY','Adc','case','session']
def char_sort(string1,string2):
#把两个字符串全部转换为小写或者大写
s1=string1.lower()
s2=string2.lower()
if s1>s2:
return -1
if s1<s2:
return 1
return 0
rs=sorted(list3,char_sort)
print(rs)
Python基础8 类、作用域、异常捕获、排序
最新推荐文章于 2021-03-01 09:22:46 发布