Python面向对象编程(上篇)

472 阅读4分钟
什么是类呢,什么是对象呢?

举个栗子,当我们说一种动物的时候,我们的侧重点是动物,但是实际上动物可以有很多种类,比如说小狗,小猫,大象等等。"动物"这种称呼是他们之间的共性,而小猫小狗的这些呢,就是动物共性中具有个性中的个体。

而在面向对象编程中,类就像动物一样,是一个抽象体,是许多事物的共性集合体,而小猫呢,就是一个实例,称为对象,是共性中实际的具体对象。

定义

在Python我们可以使用关键词class来定义一个类,并且可以对其进行各项操作

class Student:
    # 初始化方法
    def __init__(self,name,age):
        self.name = name
        self.age = age
    
    # 类中的方法,可以获得名称
    def getName(self):
        return self.name

    # 类中方法,可以获取实例化后的年龄
    def getAge(self):
        return self.age
    
    # 特殊函数,当使用print 对象的时候,返回的字符串,
    # 必须只使用return
    def __str__(self):
        return "Hello, I am student {}, and my age is {}".format(self.name,self.age)
    

在类中定义方法就类似与平常定义函数一样,只不过函数中如果需要使用本身的属性或者方法,我们便需要在函数的一个参数使用self, 并使用self.attribute调用属性以及方法,如果不需要使用,在后面下节会用提到


当我们成功的创建了一个对象之后,我们需要对这个类进行具体的实例化,创建需要的实际对象


Cyberist = Student("Cyberist","20")  # 创建一个实际的对象,并且进行初始化,名称对应,类似函数的参数
name = Cyberist.getName()  # 使用对象中的方法
age = Cyberist.getAge()
print(name)  # Cyberist
print(age)  # 20
# 当然我们也可以直接调用其属性
print(Cyberist.name) # Cyberist
print(Cyberist)  # Hello, I am student Cyberist, and my age is 20


每个人都用隐私或者不想让别人看到的东西,比如说不想让其他人知道Student的年龄,那么在Python对象编程中如何设置这些隐私呢。 在Python中我们可以使用双下划线__来定义一个私有属性,在外界不能够被访问

class Student:
    def __init__(self,name):
        self.__age = 20 
        self.name = name
    
    def __sayHello(self):
        print(self.name)


Cyberist = Student("Cyberist")
# print(Cyberist.__age ) # AttributeError: 'Student' object has no attribute '__age'
Cyberist.__sayHello() # AttributeError: 'Student' object has no attribute '__sayHello'
       

但是实际上,在Python中定义的私有属性并不是严格的私有属性和私有方法,只是Python给它们换了一个名称,如果我们要访问其实也是可以访问的,只需要使用object._class_name.__attribute方式就可以了


class Student:
    def __init__(self,name):
        self._age = 20 
        self.name = name
    
    def _sayHello(self):
        print(self.name)

Cyberist = Student("Cyberist")

print(Cyberist._Student__age)  # 20
Cyberist._Student__sayHello()  # Cyberist


注:其实事实上,我们应该使用单划线_来表示私有属性和方法,但是这种方法在实际运用的时候我们可以发现在类外面可以轻易的访问,就像访问普通的成员一样,就我个人而言推荐使用双划线__


在面向对象之中还存在着三个十分重要的特性:封装继承多态,这些特性我们将在下节中着重讲解


练习

  • 定义一个类可以描述一个人的具体特征,并定义方法可以输出自己的相关信息。

Answer

class People:
    def __init__(self,name, age):
        self.name = name 
        self.age = age
        self.favorite = None

    def sayHello(self):
        print("Hello, my name is {}, and my age is {} ,it is very nice to meet you here")
    
    def __str__(self):
        return "I am {}, aged {}".format(self.name,self.age)
    
    def get_favorite(self):
        self.favorite = input("Input what you like, and I can say it to you ! \n")

    def say_favorite(self):
        print("Hi, I know what you like, what you like is: {}, is it? xixi~".format(self.favorite))


if __name__ == '__main__':
    Cyberist = People("Cyberist",20)
    Cyberist.sayHello()
    Cyberist.get_favorite()
    Cyberist.say_favorite()
    print(Cyberist)


  • 定义一个类描述平面上的点并提供移动点和计算到另一个点距离的方法。

Answer

from math import sqrt


class Point(object):

    def __init__(self, x=0, y=0):
        """
        初始化方法
        """
        self.x = x
        self.y = y

    def move_to(self, x, y):
        """移动到指定位置
        :param x: 新的横坐标
        "param y: 新的纵坐标
        """
        self.x = x
        self.y = y

    def move_by(self, dx, dy):
        """移动指定的增量
        :param dx: 横坐标的增量
        "param dy: 纵坐标的增量
        """
        self.x += dx
        self.y += dy

    def distance_to(self, other):
        """计算与另一个点的距离
        :param other: 另一个点
        """
        dx = self.x - other.x
        dy = self.y - other.y
        return sqrt(dx ** 2 + dy ** 2)

    def __str__(self):
        return '(%s, %s)' % (str(self.x), str(self.y))


def main():
    p1 = Point(3, 5)
    p2 = Point()
    print(p1)
    print(p2)
    p2.move_by(-1, 2)
    print(p2)
    print(p1.distance_to(p2))
    
    
if __name__ == '__main__':
    main()