DAY5第五次任务

类与方法

一. 对象 = 属性 + 方法

二.Self

三.Python 的魔法方法

四.公有和私有

五.继承

六.组合

七. 类、类对象和实例对象

八.绑定

九.一些相关的内置函数

十.习题

十一.总结


一.对象 = 属性 + 方法

1.1 什么是类

对象是类的实例。类里面包含定义的方法,还有所有实例共享的数据,因此可以以类为模板创造示例。

class Turtle:  # Python中的类名约定以大写字母开头
    """关于类的一个简单例子"""
    color = 'green' #类变量

    def __init__(self,name): #定义一个初始化函数
        self.name=name #self.name是实例变量,只有在函数初始化的时候才有意义
    # 方法
    def climb(self,m):
        print('我努力地爬了%s米' %m)

a = Turtle('A') #用类创造一哥name为A的实例a
b = Turtle('B') #用类创造一哥name为B的实例b

print(a.name) #A 实例变量
print(b.name) #B 实例变量
print(a.color) #green 类变量
print(b.color) #green 类变量
a.climb(1) #我努力地爬了1米
b.climb(2) #我努力地爬了2米

上述例子中color为类变量,climb中的name为实例变量。用类创造出的变量a和b具有类的属性和方法,
可以看出,他们的类变量相同,可调用的方法也一样。

1.2 继承

子类可以继承父类的方法和变量。 在下面的例子中,Child为Father的子类,可以看出虽然a是由Child创造的,但它依然可以使用Father的变量和方法。

class Father:
    '''父类'''
    color='green'
    def climb(self,m):
        print('我努力地爬了%s米' %m)

class Child(Father):
    '''子类'''
    def walk(self,n):
        print('我轻松地走了%s米' %n)

a=Child()
a.walk(10) #我轻松地走了10米
a.climb(1) #我努力地爬了1米
print(a.color) #green

1.3多态

让具有不同功能的函数可以使用相同的函数名,使他们可以通过同一个函数名来调用。

class People(object):
    def run(self):
        print('人正在走')

class Pig(object):
    def run(self):
        print('猪正在走')

class Dog(object):
    def run(self):
        print('狗正在跑')
        
'''以上三个是不同名字的函数,多态可以使用同一个函数名来调用他们'''

def func(object): #定义一个
    object.run()

func(People()) #人正在走
func(Pig()) #猪正在走
func(Dog()) #狗正在跑

上面的例子中,定义了三个继承object的子类,然后可以使用func来调用他们。

二.Self

Self是什么?

python中的self相当于JavaScript里的this指针,指向当前实例对象。函数的第一个参数,就必须是实例对象本身,即self。

class Person:
    def __init__(self,name):
        self.name=name #self的对象为who
    def who(self):
        print('我是%s'%self.name)
a=Person('小王') #传入参数 小王
a.who() #我是小王

这个例子是我编的,往下看的时候发现和下面的例子几乎一致,夸一下自己哈哈哈。

三.Python 的魔法方法

魔法方法是一种可以自动触发的方法,在类中主要用到的是__init__(self[, ...]),在实例化的时候回自动调用。
还用刚才的例子来说明。

class Person:
    def __init__(self,name): 
        self.name=name #self的对象为who
    def who(self):
        print('我是%s'%self.name)
a=Person('小王') #在Person实例化的时候,就会自动触发__init__
a.who() #我是小王

后面一个章节会介绍更多Python中魔法方法的用法,这里就先写到这。

四.公有和私有

我对共有和私有的理解是:直接使用类的时候都可以用;当把类实例化时,实例对象则不能使用类中的私有变量或方法。

类的私有属性实例
class Person:
    height='180cm'
    __weight='75kg'

a=Person() #将Person实例化
print(a.height) #180cm
print(a.__weight) #__weight是类的私有变量,a是无法使用的
#AttributeError: 'Person' object has no attribute '__weight'

类的私有方法实例
class Person:
    def __init__(self,name):
        self.name=name #self的对象为who
    def who(self):
        print('我是%s'%self.name)
    def where(self):
        print('现在在广州')
    def __where(self):
        print('现在在广州')
a=Person('小王') #在Person实例化的时候,就会自动触发__init__
a.who() #我是小王
a.where() #现在在广州
a.__where()
#AttributeError: 'Person' object has no attribute '__from'

简而言之,私有的东西不能给新创造的实例使用。

五.继承

在1.2中介绍了一部分继承的性质,这里补充一下。子类可以继承父类的方法,但是当子类构建了一个新的方法名与父类的方法名相同时,就会将从父类那继承的方法名覆盖。

六.组合

可以把多个类写到一个类里面,这个类里变量是多个类的子类。

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("水池里面有乌龟%s只,小鱼%s条" % (self.turtle.num, self.fish.num))

p = Pool(2, 3)
p.print_num()
# 水池里面有乌龟2只,小鱼3条

七. 类、类对象和实例对象

python中万物皆对象,我对类的理解是,在内存里开辟一个空间,在里面存放类自己的东西。object是最大的类,包含一切,默认情况下不写。在类中定义的变量被称为类对象,把类实例化之后就会被称为实例对象。

class Person: #类名
    a=1 #类对象
    def who(self,name):
        print('我是%s'%self.name)
b=Person() #实例对象

八.什么是绑定?

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

Python 对象的数据属性通常存储在名为.__ dict__的字典中,我们可以直接访问__dict__,或利用 Python 的内置函数vars()获取.__ dict__

class CC:
    def setXY(self, x, y):
        self.x = x
        self.y = y

    def printXY(self):
        print(self.x, self.y)


dd = CC()
print(dd.__dict__)
# {}

print(vars(dd))
# {}

print(CC.__dict__)
# {'__module__': '__main__', 'setXY': <function CC.setXY at 0x000000C3473DA048>, 'printXY': <function CC.printXY at 0x000000C3473C4F28>, '__dict__': <attribute '__dict__' of 'CC' objects>, '__weakref__': <attribute '__weakref__' of 'CC' objects>, '__doc__': None}

dd.setXY(4, 5)
print(dd.__dict__)
# {'x': 4, 'y': 5}

print(vars(CC))
# {'__module__': '__main__', 'setXY': <function CC.setXY at 0x000000632CA9B048>, 'printXY': <function CC.printXY at 0x000000632CA83048>, '__dict__': <attribute '__dict__' of 'CC' objects>, '__weakref__': <attribute '__weakref__' of 'CC' objects>, '__doc__': None}

print(CC.__dict__)
# {'__module__': '__main__', 'setXY': <function CC.setXY at 0x000000632CA9B048>, 'printXY': <function CC.printXY at 0x000000632CA83048>, '__dict__': <attribute '__dict__' of 'CC' objects>, '__weakref__': <attribute '__weakref__' of 'CC' objects>, '__doc__': None}

九.一些相关的内置函数

  • issubclass(class, classinfo) 方法用于判断参数 class 是否是类型参数 classinfo 的子类。

  • isinstance(object, classinfo) 方法用于判断一个对象是否是一个已知的类型,类似type()

  • type()不会认为子类是一种父类类型,不考虑继承关系。

  • isinstance()会认为子类是一种父类类型,考虑继承关系。

  • 如果第一个参数不是对象,则永远返回False

  • 如果第二个参数不是类或者由类对象组成的元组,会抛出一个TypeError异常。

  • hasattr(object, name)用于判断对象是否包含对应的属性。

  • getattr(object, name[, default])用于返回一个对象属性值。

  • setattr(object, name, value)对应函数 getattr(),用于设置属性值,该属性不一定是存在的。

  • delattr(object, name)用于删除属性。

  • class property([fget[, fset[, fdel[, doc]]]])用于在新式类中返回属性值。

  • fget – 获取属性值的函数

  • fset – 设置属性值的函数

  • fdel – 删除属性值函数

  • doc – 属性描述信息

十.习题

1、以下类定义中哪些是类属性,哪些是实例属性?

class C:
    num = 0
    def __init__(self):
        self.x = 4
        self.y = 5
        C.count = 6

答:C、num是类属性;self.x、self.y和C.count是实例属性。

2、怎么定义私有⽅法?
在方法名前面加两个下划线“__”。

3、尝试执行以下代码,并解释错误原因:

class C:
    def myFun():
        print('Hello!')
    c = C()
    c.myFun()

原因是C()在C这个类里没有定义,如果把c=C()和c.myFun()去掉首行缩进,写到C类外面的话,就可以正常运行了。这样是因为他们都同属于一个Object类里。
4、按照以下要求定义一个游乐园门票的类,并尝试计算2个成人+1个小孩平日票价。

要求:

  • 平日票价100元
  • 周末票价为平日的120%
  • 儿童票半价
class Ticket():
    money=100
    childMoney=int(0.5*money)
    day=int(input('今天是周:'))
    adult=int(input('大人多少个:'))
    child=int(input('孩子多少个:'))

    if day<6:
        ticket=money*adult+child*childMoney
        print(ticket)
    elif 5<day<8:
        money=120
        ticket=money*adult+child*childMoney
        print(ticket)


------------------------------------------------------
今天是周:1
大人多少个:2
孩子多少个:1
250

十一.总结

这次的知识点基本上都是用自己的语言表述出来的,举的例子大多也都是自己写的。gogogo

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值