class turtle:#python中的类名以大写字母开头
#属性
color='green'
weight=10
legs=4
shell=true
mouth='大嘴'
#方法
def climb(self)
print("我正在努力向前爬")
def run(self)
print("我正在飞快向前跑")
def sleep(self):
print("困了,睡了,晚安,zzz")
>>>tt=Turtle()
>turtle()
>tt.climb()
oo的特征
封装、继承、多态:不同对象对同一行为的不同举动
多态:
class a:
def fun(self):
print("我是a")
class b:
def fun(self)
print("我是b")
>>>a=A()
>>>b=B()
>a.fun()
>我是a
>b.fun()
>我是b
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')
>>>a.kick()
>我叫a
>>>b.kick()
>我叫b
对于self的理解:self是在规定类时,对于未实例化对象的代称;
此外定义函数也可以用__init__(self,name)代替
防止被外部调用时可以如下操作
class Person:
__name="a"
def getName(self)
return self._name
>>>p.__name
>#报错
>>>p._person_name
>'a'#从内部属性返回_类名__变量名时可以引用
继承
class Parent:
def hello(self):
print("调用父类的方法")
class child(Parent):
pass
>>>c=Child()
>c.hello()
>调用父类的方法
import random as r
class Fish:
def__init__(self):
self.x=r.randint(0,10)
self.y=r.randint(0,10)
def move(self):
self.x-=1
print("我的位置是:",self.x,self.y)
class Goldfish(Fish):
pass
class Carp(Fish):
class Shark(Fish):
def __init__(self):
self.hungry=True
def eat(self):
if self.hungry:
print("吃吃吃")
self.hungry = False
else:
print("ok,it's enough")
但当我们使shark move时发现x并没有定义,这是由于我们在__init__(self)中重新定义了父类,使得原先的父类被覆盖。
因此针对此种情况我们有两种方法:
1、再次调用松绑的父类函数
class Shark(Fish):
def __init__(self):
Fish.__init__(self)#重新调用
self.hungry=True
def eat(self):
if self.hungry:
print("吃吃吃")
self.hungry = False
2、使用super函数
class Shark(Fish):
def __init__(self):
super().__init__()#super函数可以自动找出继承
self.hungry=True
def eat(self):
if self.hungry:
print("吃吃吃")
self.hungry = False
如果属性的名字和类的名字相同,属性会覆盖类
不要试图再一个类里边定义出所有能想到的特性和方法,应该利用继承和组合机制来进行扩展
用不同的词性命名,如属性名用名词,方法名用动词
类属性删除时实例变量的值依然保留
issubclass(b,object)
#b在object的子类里面
isinstance(object,classinfo)
#如果第一个参数不是对象,则永远返回false
#如果第二个参数不是类或者类对象组成的元组,则会出现typeerror异常