类、对象与魔法方法
13.类与对象
- 对象是类的实例
- 类定义对象的结构,以类为模板创建对象
- 类包含:方法定义和实例共享的数据
a = A()
和a = A
的区别(此处A为一个类名)
a=A()
print(a) #<__main__.A object at 0x0000020A69C81780>
a=A
print(a) #<class '__main__.A'>
print(A) #<class '__main__.A'>
分析:
a=A() 是有地址的,这说明他是一个实体,比如 int a 中的 a 一样
a=A 是没有地址的,发现他和A打印的结果一毛一样,这说明他就是A,也就是一个类名,
等价于上一句中 int a 中的 int
那么也就是说下面这两语句是等价的
b=A() 与 b=a()
则a = A()把A实例化了
1.对象 = 属性 + 方法
- 封装:信息隐蔽技术
关键字class
定义类,后面跟名称、分号和类的实现(类名约定以大写字母开头)
【例子】
class Turtle: # Python中的类名约定以大写字母开头
"""关于类的一个简单例子"""
# 属性
color = 'green'
# 方法
def climb(self):
print('我正在很努力的向前爬...')
tt = Turtle()
print(tt)
# <__main__.Turtle object at 0x0000007C32D67F98>
print(type(tt))
# <class '__main__.Turtle'>
print(tt.__class__)
# <class '__main__.Turtle'>
print(tt.__class__.__name__)
# Turtle
tt.climb()
# 我正在很努力的向前爬...
# Python类也是对象。它们是type的实例
print(type(Turtle))
# <class 'type'>
- 继承:子类自动共享父类之间数据和方法的机制
将父类名称放在子类名称后面的括号中
class MyList(list):#MyList是子类,list是父类
- 多态:不同对象对同一方法响应不同的行动
多态首先是建立在继承的基础上的,先有继承才能有多态。多态是指不同的子类在继承父类后分别都重写覆盖了父类的方法,即父类同一个方法,在继承的子类中表现出不同的形式。多态成立的另一个条件是在创建子类时候必须使用父类new子类的方式
2.self
self
相当于C++ 的this
指针- 类的方法与普通的函数对比只有一个特别的区别 —— 它们必须有一个额外的第一个参数名称(对应于该实例,即该对象本身),按照惯例它的名称是 self。在调用方法时,我们无需明确提供与参数 self 相对应的参数
【例子】
class A():
def song(one):
print(one)
def sing(self,one):
print(one)
a=A()
A.sing(a,"hello") #注意这条语句,结果为hello
a.sing("hello") #hello
A.sing("hello")#TypeError: sing() missing 1 required positional argument: 'one',提示没有给 one 赋值
即调用类class时,首先先需将类的地址赋给一个实例,这样才可以用类中的东西。若没赋值,可通过self
当作指针,指出该类名的地址,进行应用
3.Python 的魔法方法
类有一个名为__init__(self[, param1, param2...])
的魔法方法,该方法在类实例化时会自动调用
(见14章)
4.公有和私有
- 私有变量的定义:在变量名或函数名前加上“__”两个下划线
- 私有属性在类外部无法直接访问
5.继承
派生类的定义如下:
class DerivedClassName(BaseClassName)