Python面向对象的特点

一、 面向三大特性

1. 封装

- 对函数进行封装

同一类函数或同一类属性封装到一个类中   

class DB
    def dbf1():
        pass
    def dbf2():
        pass
    def dbf3():
        pass

class File:
    def file1()"
        pass
    def file2()"
        pass
    def file3()"
        pass
View Code

    

- 对数据进行封装

函数特别多,可以将数据封装到对象中,并且可以加工

def func1(a1,a2,a3,a4):
    pass

def func2(a1,a2,a3,a4):
    pass

-----------------------------------------------------------------------------------

def func1(obj):
    pass

def func2(obj):
    pass

class Data:
    def __init__(self,a1,a2,a3,a4):
        self.a1 = a1
        self.a2 = a2
        self.a3 = a3
        self.a4 = a4
        
    def dbf1(self):
        return self.a1 + self.a2

d1 = Data(11,22,33,44)


obj1 =DATA(11,22,33,44)
obj2 =DATA(44,55,66,77) 
obj.a1
obj.dbf1()
View Code

- 双层封装

对于对象也可封装

class Foo(object):
    def __init__(self,age,name):
        self.name = name
        self.age = age

class Bar(object):
    def __init__(self,counter):
        self.counter = counter
        self.obj = Foo('18','alex')

b1 = Bar(1)
View Code

2. 继承

多个类中拥有共同的函数,抽象到父类中继承即可

3. 多态

继承父类的子类拥有多种形态的相同方法

二、 加括号的四种形式

函数,类,方法,对象

def f1():
    print('f1'):

class F2(object):
    pass

class F2(object):
    def __init__(self):
        pass
    def ff3(self):
        print('ff3')

class F4(object):
    def __init__(self):
        pass
    def __call__(self):
        print('f4')

def func(arg):
    arg()

# 函数,内部执行函数
func(f1)

# 类,内部执行__init__方法
func(F2)

# 方法
# 实例化过程中执行__init__方法
obj1 = F3()
obj1.ff3
func(obj.ff3)

# 对象
# 对象加括号直接执行类中的__call__方法
obj2 = F4()
func(obj2)
View Code

三、 常用下划线方法

以下方法会在某个特定动作触发

__init__,类加括号自动触发

__call__,对象加括号自动触发

__new__,new()是在新式类中新出现的方法,它作用在构造方法init()建造实例之前,在Python 中存在于类里面的构造方法init()负责将类的实例化,而在init()调用之前,new()决定是否要使用该init()方法,因为new()可以调用其他类的构造方法或者直接返回别的对象来作为本类 的实例。

__setattr__,__getattr__,__delattr__,对象加点加方法触发

__setitem__,__getitem____delitem__,对象加中括号自动触发

__enter__

__exit__

__dict__

 __add__,对象相加的时触发
View Code

四、 metaclass

- 类是由type创建,通过metaclass指定该类由谁来创建。

class Foo(object):
    pass
print(Foo)    # <class '__main__.Foo'>


Bar = type('Foo',(object,),{})
print(Bar)    #<class '__main__.AAA'>
View Code

- type的源码无法查看,但是类可以指定创建该类的类。

class MyType(type):
    def __init__(self,*args,**kwargs):
        super(MyType,self).__init__(*args,**kwargs)

class Foo(metaclass=MyType):
    pass
View Code
原文地址:https://www.cnblogs.com/yunweixiaoxuesheng/p/8917132.html