pythonn 面向对象总结

本文总结了Python面向对象编程的要点,包括三大特性(继承、多态、封装)、类与对象的区别、面向过程与面向对象的对比、内存管理、类方法与对象方法、属性操作、错误修正、领域建模以及面向对象设计实践,如游戏设计、元类控制和学生类的计数器等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、面向对象三大特性,各有什么用处,说说你的理解。

  • 继承:解决代码的重用问题
  • 多态:多态性,可以在不考虑对象类型的情况下直接使用对象
  • 封装:明确区分内外,控制外部对隐藏属性的操作行为,隔离复杂度

2、类的属性和对象的属性有什么区别?

  • 类的属性:它包含数据属性和函数属性,数据属性是所有对象共有的,函数属性是绑定对象使用的
  • 对象属性:对象是类的实例化

3、面向过程编程与面向对象编程的区别与应用场景?

  • 面向过程:复杂的问题流程化,简单化
  • 应用场景:不再需要扩展,监测脚本,自动部署脚本,软件解压安装
  • 面向对象:特征与技能的结合 一切皆为对象
  • 应用场景:用户需求经常改变,互联网应用,游戏开发,企业内部应用

4、类和对象在内存中是如何保存的。

  • 类和对象在内存中是以字典的形式保存。(可以用__dict__查看)

5、使用实例进行 获取、设置、删除 数据, 分别会触发类的什么私有方法有什么特性

      class A(object):
               pass

      a = A()
      a["key"] = "value"
      a = a["key"]
      del a["key"]

6、python中经典类和新式类的区别

  • 经典类:python2 没有继承object的类,以及它的子类都称为经典类  -----》深度优先
  • 新式类:python3继承object的类,以及它的子类都称为新式类--------》广度优先

7、如下示例, 请用面向对象的形式优化以下代码

"""
1、在没有学习类这个概念时,数据与功能是分离的
def exc1(host,port,db,charset):     
    conn=connect(host,port,db,charset)     
    conn.execute(sql)     
    return xxx
def exc2(host,port,db,charset,proc_name)     
    conn=connect(host,port,db,charset)     
    conn.call_proc(sql)    
    return xxx
# 每次调用都需要重复传入一堆参数
exc1('127.0.0.1',3306,'db1','utf8','select * from tb1;')
exc2('127.0.0.1',3306,'db1','utf8','存储过程的名字')
"""
class  MySQLHandler:
    def __init__(self,host,port,db,charset="utf-8"):
        self.host =host
        self.port =port
        self.db = db
        self.charset = charset
        self.conn = connect(self.host,self.port,self.db,self.charset)


    def ecx1(self,sql):
        return self.conn.execute(sql)

    def ecx2(self, sql):
        return self.conn.call_proc(sql)


obj=MySQLHandler('127.0.0.1',3306,'db1')
obj.exc1('select * from tb1;')
obj.exc2('存储过程的名字')

8、请简单解释Python中 staticmethod(静态方法)和 classmethod(类方法), 并分别补充代码执行下列方法

  • 静态方法(staticmethod):非绑定方法,类和对象都可以调用
  • 类方法(classmethod):绑定给类的方法啊,类调用
class A(object):
    def __init__(self, name):
        self.name = name

    def foo(self, x):
        print("executing foo(%s, %s)" % (self, x))

    @classmethod
    def class_foo(cls, x):
        print("executing class_foo(%s, %s)" % (cls, x))

    @staticmethod
    def static_foo(x):
        print("executing static_foo(%s)" % (x))


a = A('alice')
a.foo('alice')
A.class_foo('alice')
a.static_foo('alice')
A.static_foo('alice')
'''
executing foo(<__main__.A object at 0x000002A5FED12AC8>, alice)
executing class_foo(<class '__main__.A'>, alice)
executing static_foo(alice)
executing static_foo(alice)
'''

 

12,请执行以下代码,解释错误原因,并修正错误。

错误原因:@property可以将函数属性转化为数据属性

 
  1. class Dog(object):

  2.  
  3. def __init__(self,name):

  4. self.name = name

  5.  
  6. @property

  7. def eat(self):

  8. print(" %s is eating" %self.name)

  9.  
  10. d = Dog("ChenRonghua")

  11. d.eat()

报错内容:

 
  1. Traceback (most recent call last):

  2. File "D:/py.py", line 27, in <module>

  3. d.eat()

  4. TypeError: 'NoneType' object is not callable

改正如下:

 
  1. class Dog(object):

  2.  
  3. def __init__(self,name):

  4. self.name = name

  5.  
  6. @property

  7. def eat(self):

  8. print(" %s is eating" %self.name)

  9.  
  10. d = Dog("ChenRonghua")

  11. d.eat

因为有了property,用户就可以直接输入得到结果,对于使用者来说,感知不到其属性,这就是使用property的方便之处,此方法必须有一个返回值。return 或者print都可以。

为什么要用property?

一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式 遵循了统一访问的原则

13,下面这段代码的输出结果将是什么?请解释。

class Parent(object):
   x = 1

class Child1(Parent):
   pass

class Child2(Parent):
   pass

print(Parent.x, Child1.x, Child2.x)
Child1.x = 2
print(Parent.x, Child1.x, Child2.x)
Parent.x = 3
print(Parent.x, Child1.x, Child2.x)

# 1 1 1 继承自父类的类属性x,所以都一样,指向同一块内存地址
# 1 2 1 更改Child1,Child1的x指向了新的内存地址
# 3 2 3 更改Parent,Parent的x指向了新的内存地址

 

14,多重继承的执行顺序,请解答以下输出结果是什么?并解释。

super()表示的是 子类的mro()列表中的下一个
    print
<think>好的,我现在需要处理用户关于面向对象编程的面试总结或复习资料的请。首先,我要回顾用户提供的引用内容,特别是引用[2]、[3]、[5],因为这些部分直接涉及面向对象编程的相关知识点。 首先,引用[2]提到了面向对象的特点:以类为组织单位,属性与行为结合,设计者思维,适合复杂问题,扩展性和可维护性高。这应该是面向对象的基础,需要涵盖在总结中。接着,引用[3]详细说明了C++中的面向对象概念,包括封装、继承、多态性,以及类和对象的关系,还有头文件和实现文件的结构。这部分内容需要整理成要点,可能涉及类与对象的区别、三大特性、命名空间等。引用[5]则强调封装的具体实现,对象如何封装数据,比如name和age属性,这可以作为封装部分的例子。 用户的需是面试总结或复习资料,因此我需要将这些信息结构化,分点列出关键概念,确保涵盖常见的面试问题。比如,三大特性、类与对象的区别、多态的实现方式、设计模式的应用等。同时,用户提供的引用中没有提到设计模式,但根据常见的面试题,这部分可能需要补充,尽管没有引用支持,可能需要标注说明。 另外,用户提供的示例中,快速排序部分包含了代码示例,但当前问题涉及面向对象,可能需要添加相关的代码片段。引用[3]中的C++示例可以作为参考,比如类定义、头文件结构,但用户可能需要更通用的例子,比如Java或Python,但根据引用[1]提到Java基础,可能用户对Java更感兴趣。不过引用[3]是C++的例子,所以需要平衡不同语言的情况,但用户的问题不特定于某语言,因此保持通用。 需要注意回答的结构,分点清晰,使用标题和子标题,代码示例用正确的格式。同时,根据系统指令,数学公式需要用$...$,但这里可能涉及较少数学内容,更多是概念。需要检查是否有需要LaTeX表达的部分,比如可能提到类的关系,使用UML图,但如果没有具体数学公式,可能不需要。 生成相关问题部分,需要涵盖用户可能感兴趣的后续问题,如三大特性的解释、封装的好处、多态的实现方式、设计模式的应用场景等,参考示例中的相关问题结构。 最后,引用标识需要正确对应,比如引用[2]对应面向对象的基本特点,引用[3]对应三大特性和类与对象,引用[5]对应封装的具体例子。确保每个引用只在相关部分末尾标注,自然融入内容中。 现在需要将这些思考整合成一个结构化的回答,确保覆盖所有关键点,且符合用户的需和系统指令的要。</think>### 面向对象编程面试总结与复习要点 #### 一、核心概念 1. **类与对象** - **类**是抽象的概念,定义对象的属性和方法。例如:$类 \text{Person} \{ name, age \}$。 - **对象**是类的实例化实体,如$obj1 = \text{Person("Alice", 25)}$[^5]。 - 区别:类是模板,对象是具体实现[^3]。 2. **三大特性** - **封装**:将数据和方法隐藏在类内部,仅通过接口访问。例如:私有属性通过公有方法修改[^2]。 - **继承**:子类继承父类属性和方法,支持代码复用。例如:$类 \text{Student} \text{继承} \text{Person}$。 - **多态**:同一方法在不同类中有不同实现,如方法重写和接口实现。 3. **面向对象设计优势** - 代码扩展性强、可维护性高,适合解决复杂问题。 - 通过模块化降低耦合度,提升开发效率。 --- #### 二、关键知识点详解 1. **封装的实际应用** - 数据隐藏:通过访问修饰符(如`private`、`protected`)限制直接访问。 - 示例(C++): ```cpp class Person { private: string name; int age; public: void setName(string n) { name = n; } // 封装方法 }; ``` 2. **多态的实现方式** - **编译时多态**:通过函数重载或运算符重载(如C++)。 - **运行时多态**:通过虚函数(C++)或接口(Java)实现动态绑定。 3. **类与头文件设计** - 头文件(`.h`)声明类和方法,源文件(`.cpp`)实现具体逻辑。 - 标准头文件结构避免重复包含: ```cpp #ifndef PERSON_H #define PERSON_H class Person { /* ... */ }; #endif ``` --- #### 三、常见面试问题与回答思路 1. **“为什么用面向对象而非面向过程?”** - **答**:面向对象更适合复杂系统,通过封装、继承、多态提升代码组织性和可维护性[^2]。 2. **“多态如何提升代码灵活性?”** - **答**:允许同一接口处理不同对象,例如支付系统支持多种支付方式(支付宝、微信)的统一调用。 3. **“设计模式与面向对象的关系?”** - **答**:设计模式(如工厂模式、单例模式)是面向对象特性的典型应用,解决特定场景问题(需结合项目经验举例)。 --- #### 四、代码示例(Java) ```java // 继承与多态示例 class Animal { void sound() { System.out.println("Animal sound"); } } class Dog extends Animal { @Override void sound() { System.out.println("Bark"); } // 方法重写 } public class Main { public static void main(String[] args) { Animal myDog = new Dog(); // 多态 myDog.sound(); // 输出 "Bark" } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值