Python - 子类继承父类 和 Java有什么区别

Python中子类继承父类,有一个明显的特点和Java不同,就是子类如果想用父类的方法,一定要显示调用父类方法,通俗的说就是,一定要写上,才能调用,不写上是不会自动继承的,

e.g

class Person:
    def __init__(self,name):
        self.name = "Person"

    def getName(self):
        return self.name

class Tester(Person):
    def __init__(self,name,tel):
        Person.__init__(self,name)
        self.tel = tel

aTester = Tester("aTester", "110")
print aTester.name


返回:Person,如果没有行: Person.__init__(self,name)的话,Tester就不会继承Person的这个方法。Java是会默认继承的。


### 子类继承父类的方法属性 在面向对象编程中,子类能够继承来自父类的属性方法。这一特性使得代码复用成为可能,并支持多态性的实现。 #### Java 中的继承行为 对于Java而言,当定义一个新的作为另一个现有子类时,该新自动获得其父类所有的公共(public)以及受保护(protected)成员(包括字段方法)。值得注意的是,尽管子类确实包含了父类的所有成员,但直接访问权限仅限于非私有(private)成员[^2]。因此,在编写代码时需要注意区分不同访问修饰符的影响范围: - **公有成员**:可以在任何地方被访问; - **受保护成员**:在同一包内或由子类访问; - **默认成员**:只在同一包内的间可见; - **私有成员**:完全局限于声明它们的那个内部。 即使子类无法直接操作父类中的`private`成员,仍然可以通过调用父类提供的公开接口间接获取这些数据项的信息或对其进行修改。此外,每当创建一个具体的子类实例时,实际上也会初始化一份对应的父类部分副本,这意味着每个子类对象都隐含着完整的父类结构。 ```java class Parent { public String pubField; protected int protField; private double privField; public void showPublic() { /* ... */ } } class Child extends Parent { @Override public void showPublic() { super.showPublic(); // 可以显式地调用父类版本的方法 } // 尝试直接访问privField将会导致编译错误 } ``` #### Python 中处理私有成员的方式 不同于Java严格的访问控制机制,Python采用了一种更为灵活的做法——名称改写(name mangling),用于模拟所谓的“私有化”。具体来说就是在定义体内如果遇到形如`__name`这样的标识符,则会被解释器转换成似于`_ClassName__name`的形式,从而达到一定程度上的隐藏效果[^5]。不过这并不意味着绝对的安全屏障,因为开发者依然有机会绕过这种简单的伪装手段。 ```python class Base: def __init__(self): self.public_attr = 'public' self._protected_attr = 'protected' self.__private_attr = 'private' def get_private(self): return self.__private_attr class Derived(Base): pass derived_instance = Derived() print(derived_instance.public_attr) # 输出: public print(derived_instance._protected_attr) # 输出: protected try: print(derived_instance.__private_attr) except AttributeError as e: print(e) # 抛出异常, 表明尝试访问不存在的属性 finally: print(derived_instance.get_private())# 成功输出: private ``` #### JavaScript 继承模式下的挑战 JavaScript作为一种基于原型的语言,默认情况下并没有提供像传统静态型语言那样清晰直观的层次体系。为了弥补这一点并更好地模仿经典OOP概念,ES6引入了正式的`class`语法糖衣,简化了许多常见的编码任务。然而即便如此,由于缺乏内置的支持措施来阻止对所谓“私有”组件的操作,程序员往往不得不依赖闭包或者其他技巧来构建相对封闭的数据封装环境[^3]。 ```javascript function SuperClass(){ this.sharedProperty = "shared"; function hiddenMethod(){/*...*/} // 函数作用域限定 Object.defineProperty(this,'secret',{ value:"hidden", writable:false, enumerable:false, configurable:true }); } SuperClass.prototype.commonFunc=function (){console.log('common')}; const subInstance=new (class SubClass extends SuperClass{ })(); // 测试可访问性 subInstance.sharedProperty; // 正常工作 subInstance.secret; // 不显示也不报错 subInstance.hiddenMethod(); // ReferenceError: Cannot access... subInstance.commonFunc(); // 能够正常执行 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值