Python面向对象之定义类和使用类

类是面向对象程序设计的基础,可以定义和指定类的对象。类中可以定义对象的属性(变量)和函数(方法)。


1. 声明类

在Python中,可以使用class关键字来声明一个类,基本语法如下:

#声明一个类
class Child:
    def __init__(self, name, age, height, weight):  #构造函数
        self.__Name = name; #隐藏属性,不能在外部使用,但可以在类的内部使用
        self.__Age = age;   #隐藏属性
        self.Height = height; 
        self.Weight = weight; 
        print "Hello"
    def __del__(self): #析构函数
        print "Byebye"
    def introduce(self): #成员函数(方法)
        print('My name is %s, I am %d years old.' %(self.__Name, self.__Age))
在这里,我声明了一个Child类,这里我使用了构造函数__init__()析构函数__del__(),定义了一个成员函数introduce()。

构造函数:构造函数是一个特殊函数,它拥有一个固定的名称,即__init__(注意,函数名是以两个下划线开头和两个下划线结束的)。当创建类的对象实例时系统会自动调用构造函数,通过构造函数对类进行初始化操作。在这个构造函数中,我定义了四个成员属性,其中以两个下划线开头的变量是隐藏属性(也有叫做私有变量),隐藏属性不能被外部使用,但可以在类的内部使用,公用属性(也有叫做公用变量)在外部和内部都可以使用。

析构函数:Python析构函数有一个固定的名称,即__del__(),通常在析构函数中释放类所占用的资源。使用del语句可以删除一个对象,释放它所占的资源。在这个析构函数中,我只是简单地打印了字符串"Byebye"。

成员函数:每个成员函数至少有一个参数self,包括构造函数和析构函数,这也是成员函数和普通函数的区别,可以使用self引用类的属性和成员函数。在introduce()函数中,引用了隐藏属性__Name和__Age,这两个属性在外部是引用不了的。


2. 定义一个对象

对象是类的实例。只有定义了具体的对象,才能使用类。

#定义一个对象
XiaoMing = Child('XiaoMing', 20, 172, 65);
XiaoMing.introduce();
在这里我定义了一个Child类的对象XiaoMing,并调用了成员函数introduce(),运行结果如下:
Hello
My name is XiaoMing, I am 20 years old.
定义了XiaoMing这个对象,自动调用构造函数,打印"Hello"。然后调用成员函数introduce(),引用了隐藏属性__Name和__Age,并打印出来。


3. 查看一个实例具有哪些属性

print XiaoMing.__dict__
运行结果:
{'_Child__Name': 'XiaoMing', '_Child__Age': 20, 'Weight': 65, 'Height': 172}


4. 为一个实例添加属性

XiaoMing.score = 90;
print XiaoMing.__dict__
XiaoBai = Child('XiaoBai', 21, 173, 66);
print XiaoBai.__dict__

运行结果:

{'score': 90, '_Child__Name': 'XiaoMing', '_Child__Age': 20, 'Weight': 65, 'Height': 172}
Hello
{'_Child__Name': 'XiaoBai', '_Child__Age': 21, 'Weight': 66, 'Height': 173}

可以看出,这个对象多了一个属性score,但不会影响这个实例所属类的其他对象的属性。


5. 查看一个实例所属类的属性

print XiaoMing.__class__.__dict__
运行结果:
{'__del__': <function __del__ at 0x00000000037D1518>, '__module__': '__main__', 
'introduce': <function introduce at 0x00000000037D1588>, '__init__': <function _
_init__ at 0x00000000037D7EB8>, '__doc__': None}
可以看出,这个类并没有多一个score属性。


6. 给某个实例所属类添加属性

XiaoBai.__class__.score = 80
print XiaoMing.__class__.__dict__
print XiaoMing.score
运行结果:
{'__module__': '__main__', '__del__': <function __del__ at 0x00000000037D1518>, 
'introduce': <function introduce at 0x00000000037D1588>, 'score': 80, '__doc__': 
None, '__init__': <function __init__ at 0x00000000037D7EB8>}
90
可以看出,这个类多加了一个属性score,但XiaoMing这个对象的score属性值没有变。

7. 用del语句删除对象

del XiaoMing
print XiaoMing.Height #删除之后打印报错,提示没有定义这个对象

运行结果:

Byebye

Traceback (most recent call last):
  File "G:\Python学习\程序\类和对象.py", line 47, in <module>
    print XiaoMing.Height #删除之后打印报错,提示没有定义这个对象
NameError: name 'XiaoMing' is not defined

用del删除对象时,会调用析构函数,所以会打印"Byebye",之后再调用这个对象,报错,提示没有定义这个对象。


8. 全部代码:

# -*- coding: cp936 -*-
#声明一个类
class Child:
    def __init__(self, name, age, height, weight):  #构造函数
        self.__Name = name; #隐藏属性,不能在外部使用,但可以在类的内部使用
        self.__Age = age;   #隐藏属性
        self.Height = height; 
        self.Weight = weight; 
        print "Hello"
    def __del__(self): #析构函数
        print "Byebye"
    def introduce(self): #函数(方法)
        print('My name is %s, I am %d years old.' %(self.__Name, self.__Age))

#定义一个对象
XiaoMing = Child('XiaoMing', 20, 172, 65);
XiaoMing.introduce();

#查看一个实例具有哪些属性
print
print XiaoMing.__dict__

#为一个实例添加属性
print
XiaoMing.score = 90;
print XiaoMing.__dict__

#一个实例添加属性后不会影响这个实例所属类的其他对象的属性
print 
XiaoBai = Child('XiaoBai', 21, 173, 66);
print XiaoBai.__dict__

#查看一个实例所属类的属性
print
print XiaoMing.__class__.__dict__

#给某个实例所属类添加属性,但并不影响对象XiaoMing的score属性
print
XiaoBai.__class__.score = 80
print XiaoMing.__class__.__dict__
print XiaoMing.score

#删除对象
print
del XiaoMing
print XiaoMing.Height #删除之后打印报错,提示没有定义这个对象
运行结果:
Python 2.7.14 (v2.7.14:84471935ed, Sep 16 2017, 20:25:58) [MSC v.1500 64 bit (AMD64)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> 
================== RESTART: G:\Python学习\程序\类和对象.py ==================
Hello
My name is XiaoMing, I am 20 years old.

{'_Child__Name': 'XiaoMing', '_Child__Age': 20, 'Weight': 65, 'Height': 172}

{'score': 90, '_Child__Name': 'XiaoMing', '_Child__Age': 20, 'Weight': 65, 'Height': 172}

Hello
{'_Child__Name': 'XiaoBai', '_Child__Age': 21, 'Weight': 66, 'Height': 173}

{'__del__': <function __del__ at 0x0000000003761518>, '__module__': '__main__', 
'introduce': <function introduce at 0x0000000003761588>, '__init__': <function _
_init__ at 0x0000000003767EB8>, '__doc__': None}

{'__module__': '__main__', '__del__': <function __del__ at 0x0000000003761518>, 
'introduce': <function introduce at 0x0000000003761588>, 'score': 80, '__doc__': 
None, '__init__': <function __init__ at 0x0000000003767EB8>}
90

Byebye

Traceback (most recent call last):
  File "G:\Python学习\程序\类和对象.py", line 46, in <module>
    print XiaoMing.Height #删除之后打印报错,提示没有定义这个对象
NameError: name 'XiaoMing' is not defined

总结

主要介绍了Python面向对象中类的定义的使用方法,适合初学者参考。












            
阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页