python — 面向对象【2】

self详解

self 代表当前对象,而不是类

class  User():
    name = "sc"
    def info(self):
        print(f"i am {self.name}")
        print(self)
        print(self.__class__)
user1 = User()
user1.info()
user2 = User()
user2.info()

self 不必非写成self

约定成都使用self

class  User():
    name = "sc"
    def info(this):
        print(f"i am {this.name}")
        print(this)
        print(this.__class__)
user1 = User()
user1.info()
user2 = User()
user2.info()
#实现的效果是一样的

self 可以不写 不能用实例调用,只能用类调用

class  User():
    name = "sc"
    def info(self):
        print(f"i am {self.name}")
        print(self)
        print(self.__class__)
​
    def info2():
        print("this is info2")
user1 = User()
user1.info()
user1.info2()    #不能调用
User.info2()    #可以调用

类的继承

面向对象的好处

  • 面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。 继承完全可以理解成类之间的类型和子类型关系。

  • 以节省很多的代码,不需要写,直接使用

  • 衍生出不同的子类,大部分代码一样,部分代码不一

编写类时,并非总是要从空白处开始。如果你要编写的类是另一个现成类的特殊版本,可使用继承。一个类继承另一个类时,它将自动获得另一个类的所有属性和方法;原有的类称为父类,而心类就称为子类。子类继承其父类的所有属性和方法,同时还可以定义自己的属性和方法。

创建子类时,父类必须包含在当前文件中,且必须在子类之前。在括号中包括父类的名称,父类也称为超类(superclass),名称super因此得名

class Restaurant:
    def __init__(self,restaurant_name,cuisine_type):
        print(f"This is {restaurant_name},you can choose{cuisine_type}")
    def describe_restaurant(self):
        print('running')
    def open_restaurant(self):
        print("opening")
 class Hardy(Restaurant):
    def __init__(self,name,cuisine):
        super().__init__(self,name,cuisine)    #调用父类的,super

重写父类的方法

对于父类的方法,只要不符合子类描述实物的时候,都可以进行重写,只需要在子类中定义一个方法,与父类中的相同即可。

class Restaurant:
    def __init__(self,restaurant_name,cuisine_type):
        print(f"This is {restaurant_name},you can choose{cuisine_type}")
    def describe_restaurant(self):
        print('running')
    def open_restaurant(self):
        print("opening")
 class Hardy(Restaurant):
    def __init__(self,name,cuisine):
        super().__init__(self,name,cuisine)    
        def open_restaurant(self):
        print("close")        #重写这个方法,Hardy类的open_restaurant就会是close
#继承父类的属性和方法
#对象属性查找,先在实例空间找,没有就去类空间找
#类空间也没有就去父类空间,层层往上找,直到找到object

python中的多态

  • 多态(Polymorphism)按字面的意思就是“多种状态”

  • 在面向对象语言中,接口的多种不同的 实现方式即为多态。

  • Python是一种多态语言,崇尚鸭子类型。

  • 在程序设计中,鸭子类型是动态类型的一种风格。

  • 鸭子模型是指:"当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就 可以被称为鸭子。 "

  • 我们并不关心对象是什么类型,到底是不是鸭子,只关心行为

  • 由于Python是动态语言,所以,传递给函数animal_talk(x)的参数 x 不一定是 Animal 或 Animal 的子类型。任何数据类型的实例都可以,只要它有一个talk()的方法即可。

  • 这是动态语言和静态语言最大的差别之一。动态语言调用实例方法,不检查类型,只要方法存 在,参数正确,就可以调用

class zhifubao():
    def pay(self):
        print("this is zhifubao pay")
class bank():
    def pay(self):
        print("this is bank pay")
​
class weixin():
    def pay(self):
        print("this is weixin pay")
z = zhifubao()
b = bank()
w = weixin()
def pay(obj):    #接口的多种形态,接口的重用
    obj.pay()
pay(z)

Python中的多态- 注意

  • 多态以继承和重写父类方法为前提

  • 多态是调用方法的技巧,不会影响到类的内部设计

多态性的好处

  • 增加了程序的灵活性

  • 以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如func(animal)

  • 增加了程序额可扩展性

  • 通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用func(animal)去调用

  • 多态:同一种事物的多种形态,动物分为人类,猪类(在定义角度)

  • 多态性:一种调用方式,不同的执行效果(多态性)

  • 实现接口重用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值