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)去调用
-
多态:同一种事物的多种形态,动物分为人类,猪类(在定义角度)
-
多态性:一种调用方式,不同的执行效果(多态性)
-
实现接口重用