Python类和对象

1.类以大写开头
2.面向对象特点
封装:内置方法
继承:子类自动共享父类之间数据和方法的机制

class mylistlist):#mylist继承list类
    pass
list2=mylist()#list2为一个对象
list2.append(0)#可以调用list类的内置方法

多态:不同对象对同一方法而响应不同的行动

class A:#定义一个A类
    def fun(self):#定义一个函数
        print('我是小A')
class B:#定义一个类B
    def fun(self):#定义一个函数
        print('我是小B')
a=A()
b=B()
a.fun()
b.fun()
分别输出:我是小A
         我是小B
注:不同对象对同一个方法响应不同的行动就是多态

3.面向对象方法中self
Python的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()
我叫土豆,该死的谁踢我

4.Python面向对象的一些方法
1)_ init _(self)”构造器”方法

class Ball:
    def __init__(self,name):
        self.name=name
    def kick(self):
        print('我叫%s,该死的,谁踢我...'%self.name)
A=Ball(‘足球’)
A.kick()

注:报错 TypeError: object() takes no parameters
原因: init两边的下划线为两个

2)公有和私有
在Python中定义私有变量只需要在变量名或者函数名前加上两个下划线,那么这个函数或者变量就会变成私有的了

class Person:
    __name='小甲鱼'#私有变量
若调用:报错'Person' object has no attribute 'name'
class Person:
    __name='小甲鱼'
    def GetNmae(self):
        return self.__name
p=Person()
p.GetNmae()
结果:小甲鱼

注:私有变量只能从内部调用
也可以如下方式调用:

#—类名——变量名
p._Person__name

5.继承
语法:
class DerivedClassName(BaseClassName):
括号内为:被继承者,被称为基类,父类或为超类

#定义父类:
class Parent:
    def hello(self):
        print("正在调用父类方法")
#继承
class Child(Parent):
    pass
#调用
p=Child()
p.hello()
结果为:
正在调用父类方法

注:如果子类中定义和父类同名的方法或者属性,则会自动覆盖父类对应的方法和属性

class Child(Parent):
    def hello(self):
        print("正在调用子类的方法...")
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 Goldenfish(Fish):
  pass

class Carp(Fish):
  pass

class Salmon(Fish):
  pass


class Shark(Fish):
  def __init__(self):
    self.hungry=True

  def eat(self):
    if self.hungry:
      print("吃货就像天天吃")
      self.hungry=False
    else:
      print('吃不动了')

例子shark重写了init方法,覆盖了父类方法,应该在shark中调用自己方法前应该先调用父类方法
两种方法:
1).调用未绑定的父类方法

#在子类init方法中加入:父类名__init__(self)
Fish.__init__(self)

2).使用super函数
不用给定基类的名字

在子类init方法中加入:super().__init__()
class Shark(Fish):
  def __init__(self):
    super().__init__()
    self.hungry=True

6.多重继承
语法:class DerivedClassName(Base1,Base2…..):
把多个父类写在括号中

class Base1:#定义父类1
    def fool1(self):
        print("我是fool1")
class Base2:#定义父类2
    def fool2(self):
        print("我是fool2")

 class C(Base1,Base2):#定义子类继承父类1,父类2
    pass

c=C()
c.fool1()
c.fool2()
结果:
我是fool1
我是fool2

7.组合
把类的实例化放到一个新类里面,就把旧类组合在里面,把没有继承关系的几个类组合起来

class Turtle:
  def __init__(self,x):
    self.num=x

class Fish:
  def __init__(self,x):
    self.num=x

class Pool:
  def __init__(self,x,y):
    self.turtle=Turtle(x)#把旧类的实例化放到这个新类里面
    self.fish=Fish(y)

  def print_num(self):
    print("水池里有乌龟%d只,小鱼%d条"%(self.turtle.num,self.fish.num))

8.类,类对象,实例对象

class C:#类
    count=0


 a=C()#实例对象
 b=C()
 c=C()
 C.count#类对象
 >>> a.count
0
>>> c.count+=10
>>> c.count
10
>>> a.count
0
>>> b.count
0

这里写图片描述

python中的绑定:
要求方法要有实例才能被调用,这种限制其实就是Python所谓的绑定概念

class BB
    def printBB():
        print('no zuo no die')
BB.printBB()
no zuo no die
bb=BB()
bb.printBB()#报错

9.类和对象相关的内置函数BIF
1)issubclass(class,classinfo)
一个类被认为是其自身的子类
classinfo可以是类对象组成的元组

>>>class A:
    pass

>>> class B(A):
    pass

>>> issubclass(B,A)
True
>>> issubclass(A,B)
False

2)isinstance(实例对象,类)
如果第一个参数不是对象则永远返回False
第二个参数不是类或者有类对象组成的元组会跑出typeerror异常

b1=B()
>>> isinstance(b1,B)
True

部分习题
1.按照下面提示尝试定义一个举行类并生成类实例对象
属性:长和宽
方法:设置长和宽,获得长和宽,获得面积

class Rectangle():
    length=5
    width=3
    def setRect(self):
        self.length=int(input("请输入长度"))
        self.width=int(input("请输入宽度"))
    def getRect(self):
        print("长为%d宽为%d",self.length,self.width)
    def getArea(self):
        area=self.width*self.length
        return area
>>>r=Rectangle()#实例化对象
>>> c.setRect()
请输入长度5
请输入宽度2
>>> c.getArea
10

2.游戏编程:按要求定义一个乌龟类和鱼类
~场景范围:x:0-10 y:0-10
~生成一只乌龟和一只鱼
~移动方向均为随机
~乌龟最大移动能力为2(移动距离为1或者2),小鱼为1
~当移动到边缘,自动反方向移动
~乌龟初始体力为100,移动一次消耗1体力
~乌龟和小鱼坐标重叠则吃掉鱼乌龟盛,乌龟体力耗完,小鱼胜

import random as r

class Turtle():
  x=0
  y=0
  m=0
  d=0
  def coor(self):
    self.x=r.randint(0,10)
    self.y=r.randint(0,10)
    print("乌龟此时坐标为:%d,%d"%(self.x,self.y))
  def move(self):
    self.m=r.randint(1,2)#移动距离1或者2
    self.d=r.randint(1,4)#方向,1代表上,2代表下,3代表左,4代表右
    if self.d==1:
      self.y-=self.m
    elif self.d==2:
      self.y+=self.m
    elif self.d==3:
      self.x-=self.m
    else:
      self.x+=self.m
    if self.x>10:
      self.x=20-self.x
    if self.x<0:
      self.x=-self.x
    if self.y>10:
      self.y=20-self.y
    if self.y<0:
      self.y=-self.y
    print("乌龟此时坐标为:%d,%d"%(self.x,self.y))


class Fish():
  x=0
  y=0
  def coor(self):
    self.x=r.randint(0,10)
    self.y=r.randint(0,10)
    print("小鱼此时坐标为:%d,%d"%(self.x,self.y))
  def move(self):
    self.d=r.randint(1,4)#方向,1代表上,2代表下,3代表左,4代表右
    if self.d==1:
      self.y-=1
    elif self.d==2:
      self.y+=1
    elif self.d==3:
      self.x-=1
    else:
      self.x+=1
    if self.x>10:
      self.x=20-self.x
    if self.x<0:
      self.x=-self.x
    if self.y>10:
      self.y=20-self.y
    if self.y<0:
      self.y=-self.y
    print("小鱼此时坐标为:%d,%d"%(self.x,self.y))

turtle=Turtle()
fish=Fish()


turtle.coor()
fish.coor()

turtle_x=turtle.x#初始化乌龟的随机坐标
turtle_y=turtle.y
fish_x=fish.x#初始化鱼的随机坐标
fish_y=fish.y
energy=100
count=0

while 1:
  if turtle_x==fish_x and turtle_y==fish_y:
    print("%d次fish over"%count)
    break
  else:
    energy-=1
    if energy==0:
      print("%d次turtle over!"%count)
      break
    else:
      turtle.move()
      fish.move()
      turtle_x=turtle.x#移动后乌龟的随机坐标
      turtle_y=turtle.y
      fish_x=fish.x#移动后鱼的随机坐标
      fish_y=fish.y
      count+=1
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值