一文读懂Python中的类
类(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__方法
来源:PY学习网:原文地址:https://www.py.cn/article.html