1, 类和对象是什么关系呢?
一个类为它的全部对象给出了一个统一的定义,而他的每个对象则是符合这种定义的一个实体,因此类和对象的关系就是抽象和具体的关系。
2, 类的属性定义应该尽可能抽象还是尽可能具体?
尽可能的抽象,因为这样更符合面向对象的思维
3,对象中的属性和方法,在编程中实际是什么?
属性是 变量 方法是函数
4, 函数和方法有什么区别?
方法跟函数其实几乎完全一样,但有一点区别是方法默认有一个 self 参数
5,一句话概括面向对象的几个特征
封装 对外部隐藏对象的工作细节 继承 子类自动共享父类之间数据和方法的机制 多态 可以对不同类的对象调用相同的方法,产生不同的结果
6,我们定义了一个猫类,实例化对象有哪些?
叮当猫,咖啡猫,Tom(Tom&Jerry),Kitty(Hello Kitty)
7,当程序员已经有了一个类,而又想建立一个非常相近的新类,他们会怎么做呢?
定义一个新类继承已有的这个类,这样子就只需要简单添加和重写需要的方法即可
8,self参数的作用是什么?
self 其实就是实例对象的唯一标志
9,类在实例化后哪个方法会被自动调用?
__init__方法会在类实例化时被自动调用。可以重写这个方法,为对象定制初始化方案
10,找出错误
class Uesr:
name = '菜鸟'
def myFun(self):
print("Hello")
>>> Uesr.name
'菜鸟'
>>> Uesr.myFun()
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
MyClass.myFun()
TypeError: myFun() missing 1 required positional argument: 'self'
>>>
类指的是类定义,当类定义完之后,自然就是类对象。在这个时候,你可以对类的属性(变量)进行直接访问(User.name)。fVTR"
p"R>4_9#]3`k;5~Sx+sgnjGNh
一个类可以实例化出无数的对象(实例对象),Python 为了区分是哪个实例对象调用了方法,于是要求方法必须绑定(通过 self 参数)才能调用。而未实例化的类对象直接调用方法,因为缺少 self 参数,所以就会报错
11,按以下方式重写魔法方法 __init__,结果会怎样?
class My:
def __init__(self):
return "菜鸟"
会报错,因为 __init__ 特殊方法不应当返回除了 None 以外的任何对象
12,当子类定义了与相同名字的属性或方法时,Python 是否会自动删除父类的相关属性或方法?
不会删除!Python 的做法跟其他大部分面向对象编程语言一样,都是将父类属性或方法覆盖,子类对象调用的时候会调用到覆盖后的新属性或方法,但父类的仍然还在,只是子类对象“看不到”
13,类对象是在什么时候产生?
类定义完的时候,类定义就变成类对象,可以直接通过“类名.属性”或者“类名.方法名()”引用或使用相关的属性或方法
14,如果对象的属性跟方法名字相同,会怎样?
如果对象的属性跟方法名相同,属性会覆盖方法
class C:
def conduct(self):
print('CN')
>>> c = C()
>>> c.conduct()
CN
>>> c.conduct = 1
>>> c.conduct
1
>>> c.conduct()
Traceback (most recent call last):
File "<pyshell#20>", line 1, in <module>
c.conduct()
TypeError: 'int' object is not callable
15,cc对象为什么调用 printCN() 方法失败
class 菜鸟:
def printCN():
print("no zuo no die")
>>> cc = 菜鸟()
>>> cc.printCN()
Traceback (most recent call last):
File "<pyshell#8>", line 1, in <module>
cc.printCN()
TypeError: printCN() takes 0 positional arguments but 1 was given
因为 Python 严格要求方法需要有实例才能被调用,这种限制其实就是 Python 所谓的绑定概念。所以 Python 会自动把 cc 对象作为第一个参数传入,所以才会出现 TypeError:“需要 0 个参数,但实际传入了 1 个参数“