Python学习--Task10:类和对象

一、概念

1. 对象

对象=属性+方法。通常将对象划分为两部分:静态部分和动态部分。静态部分被称为“属性”,这些属性不仅是不能被忽视的而且是不能被忽视的,如人的性别;动态部分指的是对象的行为,如人可以行走。

2. 类

类是封装对象的属性和行为的载体。在python语言中,类是一种抽象概念,如定义一个大雁类,在该类中,可以定义每个对象共有的属性和方法;而一只要从北方飞往南方的大雁则是大雁类的一个对象,对象是类的实例。

3. 面向对象程序设计的特点

  1. 封装
    将对象的属性和行为封装起来,而将对象属性和行为封装起来的载体就是类,类通常对客户隐藏其实现细节。例如,用户使用计算机,只需要使用手指敲击键盘就可以实现一些功能,而无需知道计算机内部是如何工作的。
  2. 继承
    继承是实现重复利用的重要手段,子类通过继承复用了父类的属性和行为的同时,又添加了子类特有的属性和行为。如四边形(父类)和平行四边形(子类)。
  3. 多态
    不同对象对于同一方法响应不同行动。一个父类衍生出不同的子类,子类继承父类特征的同时,也具备了自己的特征,并且能够实现不同的效果,这就是多态化结构。

二、面向对象编程

  1. self
>>>class Ball:#类
	   def setName(self,name):#方法1
		   self.name=name
	   def kick(self):#方法2
		   print("我叫%s"% self.name)
>>> a=Ball()
>>> a.setName("球A")
>>> b=Ball()
>>> b.setName("球B")
>>> c=Ball()
>>> c.setName("球C")
>>> a.kick()
我叫球A
>>> b.kick()
我叫球B	
  1. _init_(self)方法
>>> class Ball:
    		def __init__(self,name):
  			self.name=name
 		def kick(self):
  			print("我叫%s"%self.name)
>>> b=Ball("球B")  #用__init__()方法此处要加参数
>>> b.kick()
我叫球B
class Geese:
    '''大雁类'''
    def __init__(self,beak,wing,claw):
        print("我是大雁类!我有以下特征:")
        print(beak)
        print(wing)
        print(claw)
beak_1="喙的基部较高,长度和头部的长度几乎相等"
wing_1="翅膀长而尖"
claw_1="爪子是蹼状的"
wildGoose=Geese(beak_1,wing_1,claw_1)

注:

  • __init__()为双下划线;
  • __init__()方法必须包含一个self参数,还可以自定义一些参数,参数间用逗号进行分隔。
  1. 公有私有
    在python中定义私有变量只需在变量名或函数名前加上“__”两个下划线,那么这个函数或变量就会变成私有的了。
>>> class Person:
 		name="NCEPU"
>>> p=Person()
>>> p.name
'NCEPU'


>>> class Person:
		 __name="NCEPU"
 		def getName(self):
  			return self.__name
>>> p=Person()
>>> p.getName()

三、继承

一般格式:

class DerivedClassName(BaseClassName):
...
#class 类名(父类名):

实例:

class Parent:
    def hello(self):
        print("正在调用父类的方法...")
class Child(Parent):
    pass
p=Parent()
c=Child()
p.hello()
c.hello()
#输出:
正在调用父类的方法...
正在调用父类的方法...

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

class Parent:
    def hello(self):
        print("正在调用父类的方法...")
class Child(Parent):
    def hello(self):
        print("正在调用子类的方法...")
p=Parent()
c=Child()
p.hello()
c.hello()
#输出:
正在调用父类的方法...
正在调用子类的方法...

解决方法:

  • 调用未绑定的父类方法;
  • 使用super()函数。
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 Shark(Fish):
    def __init__(self):
        #方法一:调用未绑定的父类方法
        #Fish.__init__(self)
        #方法二:使用super()函数
        super().__init__()
        self.hungry = True

    def eat(self):
        if self.hungry:
            print("吃")
            self.hungry=False
        else:
            print("太撑了吃不下")
多重继承
class DerivedClassName(Base1,Base2...)
	...

组合

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

class Fish:
    def __init__(self,x):
        self.name=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))

相关的BIF

  1. issubclass(class,classinfo): 检查类是否是另一类的子类 ,若class是classinfo的子类,返回True。

注:

  • 一个类被认为是其自身的子类;
  • classinfo可以是类对象组成的元组,只要class与其中任何一个候选类的子类,则返回True。
  1. isinstance(object,classinfo):检查某实例对象是否属于某类。
    注:
  • 如果第一个参数不是对象,则永远返回False。
  • 如果第二个参数不是类或者由类对象组成的元组,会抛出一个TypeError的异常。
class A:
    pass
class B(A):
    pass
class C:
    pass
b1=B()
print(issubclass(B,A))
print(issubclass(B,B))
print(isinstance(b1,B))
print(isinstance(b1,(A,B,C)))#均为True
  1. hasattr(object,name):测试一个对象是否有指定的属性
class C:
    def __init__(self,x=0):
        self.x=x
c1=C()
print(hasattr(c1,'x'))#要用字符串的形式
  1. getattr(object,name[,default]):返回参数的属性值
    如没找到对应的属性值,则会返回default,default内容可以设置。
  2. setattr(object,name,value):设置对象中指定属性的值,若指定属性不存在,会新建一个。
  3. delattr(object,name):删除对象中指定的属性,若属性不存在就会抛出AttributeError异常。
  4. property(fget=None,fset=None,fdel=None,doc=None):通过属性设置属性。
class C:
    def __init__(self,size=10):
        self.size=size
    def getSize(self):
        return self.size
    def setSize(self,value):
        self.size=value
    def delSize(self):
        del self.size
    x=property(getSize,setSize,delSize)
c1=C()
print(c1.getSize())
print(c1.x)
c1.x=18
print(c1.x)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值