对象= 属性+方法
创建一个类对象
class Turtle: # Python 中的类名约定以大写字母开头
"""关于类的一个简单例子"""
#属性
color = 'green'
weight = 10
legs = 4
shell = True
mouth = '大嘴'
# 方法
def climb(self):
print('我正在努力的向前爬...')
def run(self):
print('我正在飞快地跑...')
def bite(self):
print('咬死你')
def eat(self):
print('有的吃')
def sleep(self):
print('睡了')
>>> tt = Turtle()
>>> tt.climb()
我正在努力的向前爬...
>>> tt.bite()
咬死你
>>> tt.sleep()
睡了
OO的特征(object oriented面向对象)
封装 信息隐蔽技术
继承 子类自动共享父类之间的数据和方法的机制
>>> class MyList(list): pass >>> list2 = MyList() >>> list2.append(5) >>> list2.append(3) >>> list2.append(7) >>> list2 [5, 3, 7]
list2继承了list函数的所有方法
多态 不同对象对不同方法响应不同的行动
>>> class A:
def fun(self):
print('我是A')
>>> class B:
def fun(self):
print('我是B')
>>> a = A()
>>> b = B()
>>> a.fun()
我是A
>>> b.fun()
我是B
self是什么?
相当于C++的this指针
同一个类可以生成无数对象,对象调用方法,对象名会传给self,方法里的self就会替换成该对象
>>> class Ball:
def setName(self, name):
self.name = name
def kick(self):
print('我叫%s'% self.name)
>>> a = Ball()
>>> a.setName('球A')
>>> b = Ball()
>>> b.setName('球B')
>>> c = Ball()
>>> c.setName('土豆')
>>> a.kick()
我叫球A
>>> c.kick()
我叫土豆
name mangling名字重造
私有函数变量:在名字前加两个下划线
>>> class Person: __name = 'xiao' def getName(self): return self.__name
无法使用XX.__name调用这个对象的name,只能间接用内部方法调用出名字,达到隐藏内部变量的目的,但是其实只是改成XX._Person_name
继承
class DerivedClassName(BaseClassName):
class 子类名(父类名):
>>> class Parent: def hello(self): print("调用父类方法") >>> class Child(Parent): pass >>> p = Parent() >>> p.hello() 调用父类方法 >>> c = Child() >>> c.hello() 调用父类方法
如果子类中定义与父类同名的方法属性,则会覆盖
解决办法
1,调用未绑定的父类方法
class Shark(Fish): def __init__(self): Fish.__init__(self) #调用父类 self.hungry = True
2,使用super函数更好
class Shark(Fish): def __init__(self): super().__init__() #使用super函数 self.hungry = True
多重继承,继承父类的方法和属性
class 子类名(父类1,父类2,...)