文章目录
Python 私有属性、单继承和方法重写
1. 私有属性和方法
- 在实际开发中,对象 的 某些属性或方法 可能只希望 在对象的内部被使用,而 不希望在外部被访问到
- 私有属性 就是 对象 不希望公开的 属性
- 私有方法 就是 对象 不希望公开的 方法
- 在 定义属性或方法时,在 属性名或者方法名前 增加 两个下划线,定义的就是 私有 属性或方法
设置私有属性之前:
class Girl:
def __init__(self, name):
self.name = name
self.age = 18
def secret(self):
print("{}的年龄是{}岁".format(self.name, self.age))
Anna = Girl("小美")
Anna.secret()
print("小美")
print(Anna.age) # 可以从外部访问属性
私有属性在外界不能被直接访问:
class Girl:
def __init__(self, name):
self.name = name
self.__age = 18 # 将 age 设置成私有属性
def secret(self):
print("{}的年龄是{}岁".format(self.name, self.__age))
Anna = Girl("小美")
Anna.secret()
print(Anna)
# 私有属性,不能被外界访问!
print(Anna.__age)
"""
程序运行结果:
AttributeError: 'Girl' object has no attribute '__age'
"""
私有方法,在外界不能直接被调用
class Girl:
# 定义属性
def __init__(self, name):
self.__name1 = name
self.__age = 18 # 如果希望属性不能在 外部被调用,可以定义该属性为私有 属性
def __secret(self): # 如果希望方法不能在外部被调用,可以定义该方法为 私有方法
print(f"{
self.__name1}的年龄是{
self.__age}")
xiaomei = Girl("小美")
""" 对象不能在类的外部 访问私有属性 调用私有方法
print(xiaomei.__age) # 对象访问属性
xiaomei.__secret() # 对象调用方法
"""
""""
程序运行结果:
AttributeError: 'Girl' object has no attribute '__secret'
"""
2. 伪 私有属性和私有方法
Python 中,并没有 真正意义 的 私有
在给 属性、方法 命名时,实际是对 名称 做了一些特殊处理,使得外界无法访问
处理方式: 在 名称 前面加上 _类名 --> _类名__名称
提示:在日常开发中,不要使用这种方式,访问对象的 私有属性 或 私有方法
Anna = Girl("小美")
Anna._Girl__secret()
print(Anna._Girl__age)
print(Anna)
3. 继承
面向对象三大特性
- 封装 根据 职责 将 属性 和 方法 封装 到一个抽象的 类 中
- 继承 实现代码的重用,相同的代码不需要重复的编写
- 多态 不同的对象调用相同的方法,产生不同的执行结果,增加代码的灵活度
3.1 继承的概念
子类 拥有 父类 的所有 方法 和 属性
class Animal:
def __init__(self):
self.color = "grey"
def eat(self): #
print("eat")
def drink(self):
print("drink")
def run(self):
print("run")
def sleep(self):
print("sleep")
# 创建 Dog 类,继承自 Animal类
class Dog(Animal):
def bark(self):
print("旺旺")
# 根据 Dog 类 创建对象
wangcai = Dog()
print(wangcai.color) # 子类对象 能够 访问 父类 封装的 属性
wangcai.bark() # 子类,可以根据自己的需求,来单独开发自己的 方法
# 子类对象,能够访问 父类 封装的方法
wangcai.eat()
wangcai.drink()
wangcai.run()
wangcai.sleep()
class XTQuan(Dog):
def fly(self):
print(" i can fly....")
xtdog = XTQuan()
xtdog.fly()
xtdog.bark()
xtdog.eat()
xtdog.sleep()
3.2 继承的语法
class 子类名(父类名):
pass
子类 继承自 父类,可以直接 享受 父类中已经封装好的方法,不需要再次开发
子类 中应该根据 职责,封装 子类特有的 属性 和 方法
专业术语
Dog 类 是 Animal 类的 子类,Animal 类是 Dog 类的 父类,Dog 类从Animal 类 继承
Dog 类 是 Animal 类的 派生类,Animal 类是 Dog 类的 基类,Dog 类从Animal 类 派生