类(Class):
用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
类
定义和实例化
类的定义,使用class关键字
class Flower(object):
pass
添加实例属性值
class Flower(object):
def __init__(self,name,color,height):
#默认值
self.name=name
self.color=color
self.height=height
类的实例化
class Flower(object):
def __init__(self,name,color,height):
self.name=name
self.color=color
self.height=height
f=Flower('玫瑰','红色',20)
print(f.name)
print(f.color)
print(f.height)
输出:
>>玫瑰
>>红色
>>20
实例属性和类属性
类没有实例属性时会调用类属性
class Flower(object):
height=20
def __init__(self,name,color):
self.name=name
self.color=color
f=Flower('玫瑰','红色')
print(f.height)
输出:
>>20
实例属性的优先级高于类属性
class Flower(object):
height=20
def __init__(self,name,color,height):
self.name=name
self.color=color
self.height=height
f=Flower('玫瑰','红色',10)
print(f.height)
输出:
>>10
删除实例属性
class Flower(object):
height=20
def __init__(self,name,color,height):
self.name=name
self.color=color
self.height=height
f=Flower('玫瑰','红色',10)
del f.height
print(f.height)
输出:
>>20#由于此时实例属性被删除,自动调用了类属性height=20
访问限制
私有属性
伪私有属性_attrname:可以访问但是不要随意访问
私有属性__attrname:一般不可以访问
访问和修改私有属性
访问私有属性
class Student(object):
def __init__(self,name,score):
self.__name=name
self.__score=score
def get_name(self):
return self.__name
def get_score(self):
return self.__score
s=Student('Jack',88)
#通过自定义方法来访问私有属性
print(s.get_name())
print(s.get_score())
#直接访问私有属性
print(s._Student__name)
print(s._Student__score)
输出:
>>Jack
>>88
>>Jack
>>88
>>a
修改私有属性
class Student(object):
def __init__(self,name,score):
self.__name=name
self.__score=score
def get_name(self,newname):
self.__name=newname
return self.__name
def get_score(self,newscore):
self.__score=newscore
return self.__score
s=Student('Jack',88)
#通过自定义方法修改私有属性
print(s.get_name('Peter'))
print(s.get_score('85'))
#直接修改私有属性
s._Student__name='Mark'
s._Student__score='86'
print(s._Student__name)
print(s._Student__score)
输出:
>>Peter
>>85
>>Mark
>>86
继承和多态
获取对象信息
type()函数获取对象信息
判断函数类型
import types
def fn():
pass
print(type(fn)==types.FunctionType)#判断是否是自定义函数
print(type(abs)==types.BuiltinFunctionType)#判断是否是内置函数
print(type(lambda x: x)==types.LambdaType)#判断是否是lambda函数
print(type((x for x in range(10)))==types.GeneratorType)#判断是否是生成器类型
输出:
>>True
>>True
>>True
>>True
isinstance()函数获取对象信息
判断类对象
class Animal(object):
pass
class Dog(Animal):
pass
class Xiaohuang(Dog):
pass
a=Xiaohuang()
b=Dog()
c=Animal()
print(isinstance(a,Dog))#Xiaohuang是否属于Dog类
print(isinstance(b,Animal))#Dog是否属于Animal类
print(isinstance(c,object))#Animal是否属于object类
输出:
>>True
>>True
>>True
判断基本类型数据
a=[1,2,3,4,5]
print(isinstance(a,(list,dict)))#判断a是否属于列表或者字典类型
输出:
>>True
内置方法的重写
class myclass():
def __len__(self):
return 10
def __repr__(self):
return 'rewrite repr!'
def __str__(self):
return 'rewrite str!'
a=myclass()
print(len(a)
print(repr(a))
print(str(a))
输出:
>>10
>>rewrite repr!
>>rewrite str!
定制属性访问
hasattr(m,’n’) m:实例 n:类里面的属性 确定属性是否存在
getattr(m,‘n’) m:实例 n:类里面的属性 得到指定类属性的值
setattr(m,’n’,x) m:实例 n:类里面的属性 x:设置属性的值 有则改无则添加
delattr(m,’n’) m:实例 n:类里面的属性 删除一个类属性
实例属性的优先级高于类属性
4.类的析构(销毁无用变量)
5.继承 重写
6.多继承 重写
在类中
super()可以调用父类里面的方法
self.方法()可以调用父类里面的方法
类中查询相关信息
1、class 查看类名
格式: 实例.class
2、dict 查看全部属性,返回属性和属性值键值对形式
格式:实例.dict
3、doc 查看对象文档,即类中(用三个引号引起来的部分)
格式:类名.dict
4、bases 查看父类
格式:类名.base
5.mro 查看多继承的情况下,子类调用父类方法时,搜索顺序
格式:子类名.mro 实例.class.mro
魔术方法:
str repr call init add
描述符
class Myattr():
def get(self,instance,owner):
print(“this is get”)
def set(self,instance,value):
print(“this is set”)
def delete(self,instance):
print(“this is delete”)
class Myclass():
attr=Myattr()
a=Myclass()
a.attr #访问属性来激活__get__方法
a.attr=1 #赋值来激活__set__方法
del a.attr #删除来激活 __delete__方法