一文读懂Python中的类

2020/09/27 08:38

类(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__方法

免费直播

    精选课程 更多

    注册电脑版

    版权所有 2003-2020 广州环球青藤科技发展有限公司