高级特性-面向对象部分
2014-11-07 11:24
429 查看
1, 类的定义使用
注意点:
构造函数式两个下划线,两边都是,否则报错,注意!!!
构造函数如果把参数self去掉,报错,默认函数调用python会增加self引用作为参数,如下测试
[nxuser@PSjamsBond-0-0-0 ~]$ python testclass.py
2. 类的继承
需要注意的地方:继承语法 class 派生类名(基类名)://... 基类名写作括号里,基本类是在类定义的时候,在元组之中指明的。
在python中继承中的一些特点:
1:在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。
2:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数
3:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。
如果在继承元组中列了一个以上的类,那么它就被称作"多重继承"
输出如下:
kerry
child constructor
subclass display2
eva
3. 隐藏数据
在python中实现数据隐藏很简单,不需要在前面加什么关键字,只要把类变量名或成员函数前面加两个下划线即可实现数据隐藏的功能,这样,对于类的实例来说,其变量名和成员函数是不能使用的,对于其类的继承类来说,也是隐藏的,这样,其继承类可以定义其一模一样的变量名或成员函数名,而不会引起命名冲突
[nxuser@PSjamsBond-0-0-0 ~]$ python testhidendata.py
Traceback (most recent call last):
File "testhidendata.py", line 8, in <module>
print(test.__name)
AttributeError: testhidden instance has no attribute '__name'
修改后,可以访问:
[nxuser@PSjamsBond-0-0-0 ~]$ python testhidendata.py
aa
关于隐藏数据,不隐藏子类同样可以定义相同名称的变量,不知道这个用处??如下测试:
[nxuser@PSjamsBond-0-0-0 ~]$ python testhidendata.py
aa
bb
如果实例对象要访问隐藏属性,需要利用:
instance._classname__name
第一个是一个下划线,第二个是两个下划线
#!/bin/python class Employee: def __init__(self,name): self.name=name def display(self): print(self.name) employee1=Employee("kerry") employee1.display()
注意点:
构造函数式两个下划线,两边都是,否则报错,注意!!!
构造函数如果把参数self去掉,报错,默认函数调用python会增加self引用作为参数,如下测试
[nxuser@PSjamsBond-0-0-0 ~]$ python testclass.py
#!/bin/python class Employee: def __init__(name): self.name=name def display(self): print(self.name) employee1=Employee("kerry") employee1.display() Traceback (most recent call last): File "testclass.py", line 12, in <module> employee1=Employee("kerry") TypeError: __init__() takes exactly 1 argument (2 given)
2. 类的继承
需要注意的地方:继承语法 class 派生类名(基类名)://... 基类名写作括号里,基本类是在类定义的时候,在元组之中指明的。
在python中继承中的一些特点:
1:在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。
2:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数
3:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。
如果在继承元组中列了一个以上的类,那么它就被称作"多重继承"
#!/bin/python class Employee: name="" def __init__(self,name): self.name=name def display(self): print(self.name) class Child(Employee): def __init__(self,name): print("child constructor") self.name=name def display2(self): print("subclass display2") employee1=Employee("kerry") employee1.display() child=Child("eva") child.display2() child.display()
输出如下:
kerry
child constructor
subclass display2
eva
3. 隐藏数据
在python中实现数据隐藏很简单,不需要在前面加什么关键字,只要把类变量名或成员函数前面加两个下划线即可实现数据隐藏的功能,这样,对于类的实例来说,其变量名和成员函数是不能使用的,对于其类的继承类来说,也是隐藏的,这样,其继承类可以定义其一模一样的变量名或成员函数名,而不会引起命名冲突
[nxuser@PSjamsBond-0-0-0 ~]$ vi testhidendata.py #!/bin/python class testhidden: __name="" test=testhidden() print(test.__name)
[nxuser@PSjamsBond-0-0-0 ~]$ python testhidendata.py
Traceback (most recent call last):
File "testhidendata.py", line 8, in <module>
print(test.__name)
AttributeError: testhidden instance has no attribute '__name'
修改后,可以访问:
#!/bin/python class testhidden: name="aa" test=testhidden() print(test.name)
[nxuser@PSjamsBond-0-0-0 ~]$ python testhidendata.py
aa
关于隐藏数据,不隐藏子类同样可以定义相同名称的变量,不知道这个用处??如下测试:
#!/bin/python class Testhidden: name="aa" class Sub(Testhidden): name="bb" test=Testhidden() print(test.name) sub=Sub() print(sub.name)
[nxuser@PSjamsBond-0-0-0 ~]$ python testhidendata.py
aa
bb
如果实例对象要访问隐藏属性,需要利用:
instance._classname__name
第一个是一个下划线,第二个是两个下划线
#!/bin/python class Testhidden: __name="aa" class Sub(Testhidden): name="bb" test=Testhidden() print(test._Testhidden__name) sub=Sub() print(sub.name)
相关文章推荐
- 高级特性-面向对象部分
- 04--面向对象高级部分随记(上)
- 深入学习javascript面向对象及高级特性
- 面向对象语言概论(三) 基于类的高级特性
- PHP面向对象深入研究之【高级特性】
- Android之JavaSe基础--面向对象高级部分(六)
- [零基础学JAVA]Java SE面向对象部分-17.面向对象高级(05) 推荐
- 【javascript】javascript之面向对象高级特性
- 08面向对象高级特性一
- 09面向对象高级特性二
- 面向对象高级特性===Java抽象类的概念和使用
- 持久化模式,第 1 部分: 现代 ORM 工具的策略和最佳实践,使用 Hibernate 特性在领域模型上应用面向对象原则
- 10面向对象高级特性三
- PHP面向对象学习之二:深入了解面向对象高级特性
- 【IOS 开发】Objective - C 面向对象高级特性 - 包装类 | 类处理 | 类别 | 扩展 | 协议 | 委托 | 异常处理 | 反射
- 面向对象的高级特性
- [零基础学JAVA]Java SE面向对象部分-19.面向对象高级(07) 推荐
- [零基础学JAVA]Java SE面向对象部分-15.面向对象高级(03) 推荐
- [零基础学JAVA]Java SE面向对象部分-16.面向对象高级(04) 推荐
- 面向对象高级特性===Java内部类及其实例化