1、封装
说明:
- 封装是面向对象编程第一步,将属性和方法封装到一个类中
- 对封装的进阶理解就是属性的私有化
class Hero:
position = "泉水"
def __init__(self,name,sex,hp,attack):
self.name = name
self.sex = sex
self.hp = hp
self.attack = attack
def info(self):
print("我叫{},性别为{},血量为{},攻击力{}".format(self.name,self.sex,self.hp,self.attack))
@classmethod
def where_am_i(cls):
print("我在{}".format(cls.postion))
@staticmethod
def haha():
print("哈哈哈哈哈")
anqila = Hero("安琪拉","女",6000,1500)
print(anqila.position)
anqila.position="龙坑"
print(anqila.position)
运行代码可知,外部可以随便访问类属性并进行修改,非常不安全。由此我们将引入一个私有化的概念。
私有化:
- 属性和方法都可以私有化,不让外部直接访问,可以提高数据的安全性,以后只暴露接口即可
- 私有化的方法,在属性或方法前面加上双下划线即可"__"
- 私有化后也可以考虑设置外部访问入口
class Hero:
__position = "泉水"
def __init__(self,name,sex,hp,attack):
self.__name = __name
self.sex = sex
self.hp = hp
self.attack = attack
def info(self):
print("我叫{},性别为{},血量为{},攻击力{}".format(self.name,self.sex,self.hp,self.attack))
@classmethod
def where_am_i(cls):
print("我在{}".format(cls.postion))
@classmethod
def get_position(cls):
return cls._position
@classmethod
def set_position(cls,position):
cls._position = _position
return cls._position
@staticmethod
def haha():
print("哈哈哈哈哈")
anqila = Hero("安琪拉","女",6000,1500)
print(anqila.position)
print(get_position())
print(set_position("龙坑"))
anqila.name = "程咬金"
anqila.info()
把name私有化后,外部就不能修改了
2、继承
什么是继承?
class A:
money = 10
def study(self):
print("学习好")
class B(A):
pass
print(B.money)
b = B()
b.study()
说明:
- 上述代码中A是父类,B是子类,A被B继承了
- 继承就是子类拥有父类的所有属性和方法
继承的好处:相同的代码不需要重复编写
1.单继承
语法:
class 子类名(父类名):
pass
如果继承的父类方法不合适,可以在子类重写父类方法
注意:私有化的属性和方法不会被继承
2.多继承:
语法:
class 子类名(父类名1,父类名2...):
pass
示例代码:
class A:
def eat(self):
pass
class B:
def sleep(self):
pass
class C(A,B):
pass
c=C()
c.eat()
c.sleep()
3、多态
不同对象调用同名方法,产生不同执行结果(以继承和重写父类方法为前提)
class Animal:
def speak(self):
print("鬼叫")
class Dog(Animal):
def speak(self):
print("汪汪")
class Cat(Animal):
def speak(self):
print("喵喵")
a = Animal()
b = Dog()
c = Cat()
def speak(x):
x.speak()
speak(a)
speak(b)
speak(c)
作用:增加代码灵活度