2018最常见的Python面试题----------------------------第二波福利

版权声明:CSDN 博主刘康康 https://blog.csdn.net/liiukangkang/article/details/83340254

1.为什么要有面向对象?面向对象中为什么要定义类型创建对象?

面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物加之Python非常适合面向对象的编程(OOP),因为它支持通过组合(composition)与继承(inheritance)的方式定义类(class)。

面向对象: Python既支持面向过程的函数编程也支持面向对象的抽象编程。在面向过程的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在面向对象的语言中,程序是由数据和功能组合而成的对象构建起来的。与其他主要的语言如C++和Java相比,Python以一种非常强大又简单的方式实现面向对象编程。

面向对象中为什么要定义类型创建对象?

因为对象是类的具体表现形式,是实际存在的个体。类是一系列事物的统称,对象就是类具体化的实例,所以在面向对象中,可以通过定义类,将这一系列的事物(对象)表现出来。

2.面向对象中,类属性和成员属性都有什么意义?有什么样的区别?

类的内部定义的变量叫做属性。

内部定义的函数称为方法,统称为类的成员

成员属性是在类声明定义好的属性,通过self进行封装在类中,经过实例化对象后,成为对象特有的属性。

类属性是在类中声明定义的变量,但是不同于成员属性,类属性没有经过self封装而直接定义的。所以类属性只属于当前类,实例化的对象只能调用而不能修改。类属性只能通过类本身修改。

3.面向对象继承关系中,子类重写了父类的方法,通过子类的实例对象怎么直接调用父类的该方法?

  # 1.父类名.父类方法()

        # Animal.__init__(self)

        # 2.super(子类名,self).父类方法()

扫描二维码关注公众号,回复: 3797840 查看本文章

        # super(Cat, self).__init__()

        # 3. super().父类方法()。只在 python3 可用

#案例
class Animal:
    def __init__(self, name):
        self.name = name
    def eat(self):
        print('动物能吃东西')
class Cat(Animal):
    def __init__(self, name, age):
        super(Cat, self).__init__(name)
        self.age = age
    def eat(self):
        super().eat()
        print('猫爱吃鱼')
cat = Cat('波斯猫', 3)
cat.eat()
cat1 = Animal('加菲猫')
cat1.eat()

4.面向对象的继承关系中,子类可以同时继承多个父类[多继承机制],python2和python3。

多继承关系中,如果多个父类中出现了相同名称的属性/方法,python2和python3中调用父类方法时,查询方式是什么样的(广度查询、深度查询)?

Class Person(object):
def __init__(self):
    self.value = "类型AAAAAAAAAAA的value值"
def show(self):
    print("类型aaaaaaaaaaaa中的show执行了")
Class Professor(person)  教授
Pass
Class Teacher()
def __init__(self):
    	self.value = "类型CCCCCCCCC中的value值"
    def show(self):
    	print("类型ccccccccccccc中的show执行了")
Class Doctor()
def __init__(self):
        self.value ="类型D中的value值"
    def show(self):
        print("类型d中的show执行了")
Class Student(Professor,Teacher,Doctor)
Pass
P = Student()

Python2,  调用父类方法时进行广度查询

Print(p.value)-------------->python2  输出结果:类型CCCCCCCCC中的value值

Python3,  调用父类方法时进行深度查询

Print(p.value)-------------->python3  输出结果:类型AAAAAAAAAAA的value值

实例:

class Forest:                               # 定义的父类1
    def __init__(self, name):
        self.Name = name
    def action1(self):
        print("%s是非常厉害的" % self.Name)
class Activity:                             # 定义的父类2
    def __init__(self, obj):
        self.Obj = obj
    @staticmethod
    def action2(describe):
        print("非常的%s" % describe)
class Subclass(Forest, Activity):             # 子类,(衍生)出新的类
    print("森林里边")
P = Subclass("猴子")         # 森林里边                # 实例化子类
P.action1()                  #猴子是非常厉害的         # 调用父类1属性
P.action2("灵活")            #非常的灵活               # 调用父类2属性

5.面向对象程序设计开发中,python2曾经出现了一种特殊的类型[经典类],请简要描述经典类和新式类的区别?python3中定义的类型是哪种类型?

●新式类对象可以直接通过__class__属性获取自身类型:type
●继承搜索的顺序发生了改变,经典类多继承属性搜索顺序: 先深入继承树左侧,再返回,开始找右侧;新式类多继承属性搜索顺序: 先水平搜索,然后再向上移动
●新式类增加了__slots__内置属性, 可以把实例属性的种类锁定到__slots__规定的范围之中。
●新式类增加了__getattribute__方法

6.面向对象中,静态方法、类方法、成员方法分别怎么定义?他们之间都有什么样的区别?

@staticmethod
静态方法,通过类直接调用,不需要创建对象,不会隐式传递self.

@classmethod
类方法,方法中的self是类本身,调用方法时传的值也必须是类的公有属性,就是说类方法只能操作类本身的公有字段

@membermethod

成员属性是在类声明定义好的属性,通过self进行封装在类中,经过实例化对象后,成为对象特有的属性。

@staticmethod,该方法就与类中的其他(属性,方法)没有关系,不能通过实例化类调用方法使用类变量,只能单纯的使用方法本身。

class dog(object):
    def __init__(self,name):
        self.name=name
    @staticmethod
    def eat():
        print '%s吃%s'%('w','e')
d=dog('二哈')  #传参
d.eat()            #运行结果: w吃e

@classmethod:只能访问类变量,不能访问实例变量。

class dog(object):
    name='hh'
    def __init__(self,name):
        self.name=name
    @classmethod
    def eat(self):
        print '%s吃%s'%(self.name,'e')
d=dog('tt')
d.eat()         # 结果:hh吃e

7.什么是元类?

 

 

8.简要描述python中的垃圾回收机制?

什么是引用计数?什么是标记-清除?什么是分代回收?

python中的垃圾回收机制是什么样的?

他们三者之间的区别?

简要描述引用计数的操作原理和它存在的一些问题?

简要描述标记清除的操作原理和它存在的一些问题?

简要描述分代回收的操作原理和它存在的一些问题?

9.Python 可以用在什么方面?

无论是从入门级选手到专业级选手都在做的爬虫,还是 Web 程序开发、桌面程序开发还是科学计算、图像处理,数据的采集,卷积神经网络中的图像识别等等,Python 都可以胜任。

猜你喜欢

转载自blog.csdn.net/liiukangkang/article/details/83340254