Lokasi ngalangkungan proxy:   [ UP ]  
[Ngawartoskeun bug]   [Panyetelan cookie]                
Skip to content

Commit 4f5c799

Browse files
Create Python面向对象.md
Python面向对象相关面试题
1 parent 0d4c94c commit 4f5c799

1 file changed

Lines changed: 287 additions & 0 deletions

File tree

Python面向对象.md

Lines changed: 287 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,287 @@
1+
* [1.面向对象](#1面向对象)
2+
* [2.什么是类和类变量?](#2什么是类和类变量)
3+
* [3.实例和实例化以及实例变量](#3实例和实例化以及实例变量)
4+
* [4.数据成员](#4数据成员)
5+
* [5.方法和静态方法以及类方法](#5方法和静态方法以及类方法)
6+
* [6.什么是方法重写](#6什么是方法重写)
7+
* [7. _ _ <strong>init</strong> _ _](#7-_-_-init-_-_)
8+
* [8.self](#8self)
9+
* [9.类的初始化:new() 和 init()](#9类的初始化new-和-init)
10+
* [10.<strong>@classmethon</strong>](#10classmethon)
11+
* [11.<strong>@staticmethod</strong>](#11staticmethod)
12+
* [12.设计的一个面向对象程序设计的完整示例。](#12设计的一个面向对象程序设计的完整示例)
13+
* [13.私有属性](#13私有属性)
14+
* [14.类的继承](#14类的继承)
15+
* [15.多继承](#15多继承)
16+
17+
18+
#### 1.面向对象
19+
20+
**抽象**:提取现实世界中某事物的关键特性,为该事物构建模型的过程。对同一事物在不同的需求下,需要提取的特性可能不一样。得到的抽象模型中一般包含:属性(数据)和操作(行为)。这个抽象模型我们称之为类。对类进行实例化得到对象。
21+
22+
**封装**:封装可以使类具有独立性和隔离性;保证类的高内聚。只暴露给类外部或者子类必须的属性和操作。类封装的实现依赖类的修饰符(public、protected和private等)
23+
24+
**继承**:对现有类的一种复用机制。一个类如果继承现有的类,则这个类将拥有被继承类的所有非私有特性(属性和操作)。这里指的继承包含:类的继承和接口的实现。
25+
26+
**多态**:多态是在继承的基础上实现的。多态的三个要素:继承、重写和父类引用指向子类对象。父类引用指向不同的子类对象时,调用相同的方法,呈现出不同的行为;就是类多态特性。多态可以分成编译时多态和运行时多态。
27+
28+
#### 2.什么是类和类变量?
29+
30+
用来描述具有相同属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。其中的对象被称作类的实例。
31+
32+
类变量:类变量是所有实例公有的变量。类变量定义在类中,但在方法体之外。
33+
34+
#### 3.实例和实例化以及实例变量
35+
36+
实例:也称对象。通过类定义的初始化方法,赋予具体的值,成为一个”有血有肉的实体”。
37+
38+
实例化:创建类的实例的过程或操作。
39+
40+
实例变量:定义在实例中的变量,只作用于当前实例。
41+
42+
#### 4.数据成员
43+
44+
类变量、实例变量、方法、类方法、静态方法和属性等的统称。
45+
46+
#### 5.方法和静态方法以及类方法
47+
48+
方法:类中定义的函数。
49+
50+
静态方法:不需要实例化就可以由类执行的方法
51+
52+
类方法:类方法是将类本身作为对象进行操作的方法。
53+
54+
#### 6.什么是方法重写
55+
56+
如果从父类继承的方法不能满足子类的需求,可以对父类的方法进行改写,这个过程也称override。
57+
58+
#### 7. _ _ __init__ _ _
59+
60+
可以成为类的实例对象的构造函数,每次通过类创建一个该类的对象是调用此函数,所以其下的以sefl.前缀的变量是每个创建好了的实例(化)对象的所独有的。换句话说,有多少个类的对象内存里就有多少份这个实例对象变量存在。就像生产了多少小汽车就有多少个方向盘似的。
61+
62+
#### 8.self
63+
64+
代表运行时的类的实例对象本身,一般在类的内部设计时出现,在程序里使用对象编程时不用self。在实例对象的成员函数里以self.前缀的变量是实例对象的成员变量,没有self.的变量是本方法函数的局部变量。
65+
66+
#### 9.类的初始化:new() 和 init()
67+
68+
new()方法用来实例化最终的类对象,在类创建之前被调用,它在类的主体被执行完后开始执行。
69+
70+
init()方法是在类被创建之后被调用,用来执行其他的一些输出化工作
71+
72+
当我们构造元类的时候,通常只需要定一个init()或new()方法,但不是两个都定义。但是,如果需要接受其他的关键词参数的话,这两个方法就要同时提供,并且都要提供对应的参数签名。
73+
74+
#### 10.**@classmethon**
75+
76+
这个关键字是修饰器,修饰也是说下面的函数是类的方法函数而不是类的对象的方法函数。
77+
78+
#### 11.**@staticmethod**
79+
80+
这个也是修饰器,说明接下来的函数是一个静态函数,和实例对象的成员函数、类函数的区别主要在第一个形参,既无self又无cls。可以被类或对象直接调用。 差不多解释完了,下面来看一个具体的类的实例程序。
81+
82+
#### 12.设计的一个面向对象程序设计的完整示例。
83+
84+
```
85+
# coding:utf-8
86+
class Horse(object):
87+
variety = "大宛马"
88+
def __init__(self, name = "green", height = 0.5, length = 1.3, sex = "male"):
89+
# self.name是成员变量,name是形参、局部变量
90+
self.name = name
91+
self.height = height
92+
self.length = length
93+
self.sex = sex
94+
print "A baby horse is born called", self.name
95+
96+
def print_info(self):
97+
print self.name, self.height, self.length, self.sex, Horse.variety#,Horse.address
98+
Horse.print_variety() # 在对象方法里通过类调用类方法,避免
99+
Horse().print_ci(200, 100)# 对象调用静态方法
100+
Horse.print_ci(200, 100) # 类调用静态方法
101+
102+
@staticmethod
103+
def print_ci(x, y):
104+
print x, y
105+
106+
@classmethod
107+
def pp(cls):
108+
# 类使用类变量
109+
print cls.variety, Horse.variety, cls.address
110+
#cls.print_variety()
111+
print Horse().name # 对象使用对象的成员变量
112+
@classmethod
113+
def print_variety(cls):
114+
cls.address = "xi'an"
115+
print "type", type(cls.address)
116+
print cls.variety, Horse.variety, cls.address
117+
Horse.pp()# 类调用类方法
118+
Horse().print_ci(100, 100)# 对象调用静态方法
119+
120+
a = Horse("xiaoxuanfeng")
121+
b = Horse("pilihuo", sex = "female")
122+
a.print_info()
123+
b.print_info()
124+
Horse.print_variety()
125+
print "*" * 20
126+
Horse.pp() # 类调用类方法
127+
Horse.print_ci(12, 23)# 类外类调用静态方法
128+
a.print_ci(23, 31) # 类外对象调用静态方法
129+
```
130+
131+
#### 13.私有属性
132+
133+
变量和函数
134+
135+
- 定义私有变量
136+
137+
```
138+
class aa(object):
139+
def __init__(self, w, v):
140+
self.x = w
141+
self.__y = v
142+
def p(self):
143+
print " x", self.x
144+
print "__y", self.__y
145+
ai = aa(12, 13)
146+
ai.p()
147+
```
148+
149+
程序的执行结果:
150+
151+
```
152+
x 12
153+
__y 13
154+
```
155+
156+
- 定义私有函数,不能在类的外部调用。
157+
158+
```
159+
class aa(object):
160+
def __init__(self, w, v):
161+
self.x = w
162+
self.__y = v
163+
def p(self):
164+
print " x", self.x
165+
print "__y", self.__y
166+
self.__q()
167+
def __q(self):
168+
print "private method of class aa"
169+
ai = aa(12, 13)
170+
ai.p()
171+
#aa.__q()
172+
#ai.__q()
173+
#ai._aa__q()
174+
```
175+
176+
程序的执行结果:
177+
178+
```
179+
x 12
180+
__y 13
181+
private method of class aa
182+
```
183+
184+
`__q`函数是类aa的私有函数,可以在类内部使用,但不能在类之外使用。
185+
186+
#### 14.类的继承
187+
188+
假如已经有几个类,而类与类之间有共同的变量属性和函数属性,那就可以把这几个变量属性和函数属性提取出来作为基类的属性。而特殊的变量属性和函数属性,则在本类中定义,这样只需要继承这个基类,就可以访问基类的变量属性和函数属性。可以提高代码的可扩展性。通过继承可以快速扩展和实现函数的多样性
189+
190+
举例:
191+
192+
```
193+
class aa(object):
194+
def __init__(self, v):
195+
self.x = v
196+
self.__pa = 10
197+
def p(self):
198+
print "class aa's instance method"
199+
def info(self):
200+
print "info of aa instance"
201+
class cc(aa):
202+
def __init__(self, v):
203+
self.z = v
204+
self__pc = 10
205+
def p(self):
206+
print "class cc's instance method"
207+
a = aa(10)
208+
c = cc(30)
209+
a.p()
210+
a.info()
211+
c.p()
212+
c.info()
213+
```
214+
215+
程序执行结果:
216+
217+
```
218+
class aa's instance method
219+
info of aa instance
220+
class cc's instance method
221+
info of aa instance
222+
```
223+
224+
#### 15.多继承
225+
226+
Python的类允许可以有多个父类,从左至右有顺序要求,这和后续搜索查找数据和函数有关系。
227+
228+
```
229+
class 子类(父类1, 父类2, ...)
230+
```
231+
232+
多继承时子类的父类间和子类要满足人类的**伦理规则**
233+
234+
举例:
235+
236+
```
237+
class aa(object):
238+
def __init__(self, v):
239+
self.x = v
240+
def px(self):
241+
print self.x
242+
243+
class bb(object):
244+
def __init__(self, v):
245+
self.y = v
246+
def py(self):
247+
print self.y
248+
249+
class cc(aa, bb):
250+
def __init__(self, v, v1 = 100):
251+
print "cc"
252+
super(cc, self).__init__(v1)
253+
#aa.__init__(self, v1)
254+
#bb.__init__(self, v1)
255+
print "ccx"
256+
self.z = v
257+
def pz(self):
258+
print self.z
259+
260+
a = aa(12)
261+
a.px()
262+
b = bb(13)
263+
b.py()
264+
c = cc(14)
265+
print dir(c)
266+
c.pz()
267+
```
268+
269+
程序的执行结果:
270+
271+
```
272+
12
273+
13
274+
cc
275+
ccx
276+
['__class__', ..., '__weakref__', 'px', 'py', 'pz', 'x', 'z']
277+
14
278+
```
279+
280+
#### 参考链接
281+
282+
https://blog.csdn.net/weixin_39628063/article/details/111455821
283+
284+
http://liao.cpython.org/27classobject/
285+
286+
https://blog.csdn.net/weixin_35390379/article/details/112022047
287+

0 commit comments

Comments
 (0)