高级特性-面向对象部分

来源:互联网 发布:如何评价汤灿 知乎 编辑:程序博客网 时间:2024/05/16 07:25

1. 类的定义使用

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/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 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/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 12in <module>
    employee1=Employee("kerry"
TypeError: __init__() takes exactly 1 argument (2 given)

2. 类的继承

需要注意的地方:继承语法 class 派生类名(基类名)://... 基类名写作括号里,基本类是在类定义的时候,在元组之中指明的。

在python中继承中的一些特点:

  • 1:在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。

  • 2:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。区别于在类中调用普通函数时并不需要带上self参数

  • 3:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)。

如果在继承元组中列了一个以上的类,那么它就被称作"多重继承"

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/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中实现数据隐藏很简单,不需要在前面加什么关键字,只要把类变量名或成员函数前面加两个下划线即可实现数据隐藏的功能,这样,对于类的实例来说,其变量名和成员函数是不能使用的,对于其类的继承类来说,也是隐藏的,这样,其继承类可以定义其一模一样的变量名或成员函数名,而不会引起命名冲突

?
1
2
3
4
5
6
7
8
9
10
[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'

修改后,可以访问:

?
1
2
3
4
5
6
7
8
#!/bin/python
 
class testhidden:
 
   name="aa"
 
test=testhidden()
print(test.name)

[nxuser@PSjamsBond-0-0-0 ~]$ python  testhidendata.py 

aa

关于隐藏数据,不隐藏子类同样可以定义相同名称的变量,不知道这个用处??如下测试:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/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

第一个是一个下划线,第二个是两个下划线

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/python
 
class Testhidden:
 
   __name="aa"
 
class Sub(Testhidden):
   name="bb"
 
test=Testhidden()
print(test._Testhidden__name)
 
sub=Sub()
print(sub.name)
0 0
原创粉丝点击