python-----私有属性,继承

本文探讨了Python中多继承的实现方式及其与单继承的区别,并深入解析了类的私有属性与私有方法的使用场景及定义方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

多继承

# _*_ coding:utf-8 _*_              
"""
file: 多继承.py
date: 2018-07_22 9:12 AM
desc:
"""
# 多继承与单继承

class A():
    def test(self):
        print '这是A----test方法'
    def demo(self):
        print '这是A------demo方法'
class B():
    def demo(self):
        print '这是B----demo方法'
    def test(self):
        print '这是B-----test方法'


class C(A,B):
    # 多继承可以让子类同时拥有多个父类的属性和方法
    # 昨天的子类拥有一个父类叫单继承
    # 多个父类同时拥有的属性和方法,子类调用前一个,此方法中调用为A
    pass
c = C()
c.test()
c.demo()
# 新式类继承自object,即 class A(object): 经典类class A

子类中调用父类私有属性或方法

类属性与方法
类的私有属性

__private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs。
类的方法

在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数
类的私有方法

__private_method:两个下划线开头,声明该方法为私有方法,不能在类的外部调用。在类的内部调用 self.__private_methods 

Python不允许实例化的类访问私有数据,但你可以使用 object.className__attrName( 对象名.类名__私有属性名 )访问属性

# _*_ coding:utf-8 _*_              
"""
file: 子类中调用父类的私有属性或方法.py
date: 2018-07_22 10:06 AM
desc:
"""
class A(object):
    def __init__(self):
        # 在初始化方法中定义了两个属性,一个公共属性,一个私有属性
        self.num1=100
        self.__num2=200
        # 定义私有方法
    def __test(self):
        print '私有方法%d %d' %(self.num1,self.__num2)
    # 调用私有属性
    def test(self):
        print '%d' %self.__num2
        # 调用私有方法
        self.__test()
class B(A):
    def demo(self):
        # 在子类的方法中,不能访问父类的私有属性
        print '访问父类的私有属性 %d' % self.__num2
        pass
# 创建一个子类对象
b = B()
print b
# 在外界不能直接访问对象的私有属性/调用私有方法
# print b.__num2
# b.__test
# b.demo()
b.test()

继承私有属性和方法

# _*_ coding:utf-8 _*_
"""
file: 继承的私有属性和私有方法.py
date: 2018-07_22 9:43 AM
desc:
"""
"""
父类的私有属性和私有方法
1子类对象不能在自己的方法内部,直接访问父类的私有属性和私有方法
2子类对象可以通过父类的共有方法间接访问到私有属性或私有方法
私有属性,私有方法是对象的隐私,不对外公开,外界以及子类都不能直接访问
私有属性,私有方法常做一些内部的事情
"""


class A(object):
    def __init__(self):
        # 在初始化方法中定义了两个属性,一个公共属性,一个私有属性
        self.num1=100
        self.__num2=200
        # 定义私有方法
    def __test(self):
        print '私有方法%d %d' %(self.num1,self.__num2)
class B(A):
    def demo(self):
        # 在子类的方法中,不能访问父类的私有属性
        print '访问父类的私有属性 %d' % self.__num2
        self.__test()
        pass
# 创建一个子类对象
b = B()
print b
# 在外界不能直接访问对象的私有属性/调用私有方法
# print b.__num2
# b.__test
b.demo()
私有属性和私有方法
应用场景及定义方式
应用场景
    在实际开发中,对象的某些属性或方法可能只希望在对象的内部使用,而不希望在外部被访问到
    私有属性 就是 对象 不希望公开的 属性
    私有方法 就是 对象 不希望公开的 方法
定义方法
    在定义属性或方法时,在属性名或者方法名前增加两个下划线,定义的就是私有属性或方法
"""
class Women():
    def __init__(self,name):
        self.name = name
        self.__age = 18
    def ___secret(self):
        print '%s 的年龄是 %d' % (self.name,self.__age)

lily = Women('lily')
# 私有属性,在外界不允许直接访问
#print lily.age
# 私有方法,外界不允许直接访问
lily.secret()
### Python 面向对象编程中的封装继承 #### 封装的概念与用法 封装是一种将数据(性)行为(法)绑定到一起的技术,通过这种式隐藏内部实现细节并提供对外接口。在 Python 中,可以通过类来定义封装的对象。通常情况下,私有属性法会被标记为单下划线 `_` 或双下划线 `__` 开头,表示这些成员不应该被外部直接访问。 以下是封装的一个简单示例: ```python class BankAccount: def __init__(self, owner, balance=0): self.owner = owner self.__balance = balance # 私有属性 def deposit(self, amount): if amount > 0: self.__balance += amount print(f"存款成功,当前余额:{self.__balance}") else: print("存款金额需大于零") def withdraw(self, amount): if 0 < amount <= self.__balance: self.__balance -= amount print(f"取款成功,当前余额:{self.__balance}") else: print("取款失败,余额不足或输入不合法") def get_balance(self): return f"账户余额:{self.__balance}" account = BankAccount("Alice", 100) print(account.get_balance()) account.deposit(50) account.withdraw(30) # 尝试访问私有属性会报错 # print(account.__balance) ``` 在这个例子中,`__balance` 是一个私有变量,无法从外部直接修改它[^1]。 --- #### 继承的概念与用法 继承允许创建一个新的类(子类),该新类可以从现有的类(类)那里获取其所有的功能,并可以选择性地覆盖某些法或者添加新的法。这有助于提高代码的可重用性扩展性。 下面是一个关于动物及其声音的例子: ```python class Animal: def __init__(self, name): self.name = name def speak(self): raise NotImplementedError("子类必须实现此法") class Dog(Animal): def speak(self): return f"{self.name} says Woof!" class Cat(Animal): def speak(self): return f"{self.name} says Meow!" animals = [Dog("Rex"), Cat("Mittens")] for animal in animals: print(animal.speak()) ``` 在此处,`Dog` `Cat` 类都继承自 `Animal` 类,并实现了自己的 `speak()` 法[^2]。 如果存在多重继承,则需要注意调用顺序以及可能引发的法冲突问题。例如,在 C3 线性化算法的帮助下解决 MRO(Method Resolution Order)。以下是一段涉及多个基类的情况: ```python class A: def who_am_i(self): print('I am a class A') class B(A): def who_am_i(self): print('I am a class B') class C(A): def who_am_i(self): print('I am a class C') class D(B, C): pass d_instance = D() d_instance.who_am_i() # 输出取决于 MRO 的解析结果 print(D.mro()) # 显示实际查找路径 ``` 这里展示了如何利用超类初始化器完成复杂的场景设置[^4]。 --- #### 结合封装与继承的实际应用案例 考虑构建一个简单的员工管理系统,其中既有普通职员也有经理角色,他们共享一些共同特征但也具备各自独特之处。 ```python class Employee: def __init__(self, emp_id, name, salary): self._emp_id = emp_id # 受保护字段 self.name = name # 公开字段 self.salary = salary # 公开字段 def display_info(self): return f"ID: {self._emp_id}, Name: {self.name}, Salary: ${self.salary}" class Manager(Employee): def __init__(self, emp_id, name, salary, department): super().__init__(emp_id, name, salary) # 使用super函数调用级构造器 self.department = department # 新增部门信息 def manage_department(self): return f"{self.name} manages the {self.department} department." manager = Manager(emp_id='MGR_007', name="John Doe", salary=90000, department="Sales") employee = Employee(emp_id='EMP_123', name="Jane Smith", salary=60000) print(manager.display_info()) # 来源于Employee类的功能 print(employee.display_info()) # 同样来源于Employee类的功能 print(manager.manage_department()) # 特定于Manager的行为 ``` 以上程序片段清楚表明了怎样合理运用继承机制减少重复编码量的同时还增强了灵活性[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值