python -- 面向对象编程

2017-09-04  本文已影响122人  b485c88ab697

面向对象编程

python中一切皆为对象,所谓对象:人是一个对象,电脑是一个对象

我们通过描述属性(特征)和行为来描述一个对象的。

什么是类

在python中,一个对象的特征也称为属性(attribute)。它所具有的行为也称为方法(method)

结论:对象=属性+方法

在python中,把具有相同属性和方法的对象归为一个类(class)

比如人,动物,植物等等,这些都是类的概念。

类是对象的模板或蓝图,类是对象的抽象化,对象是类的实例化。类不代表具体的事物,而对象表示

具体的事物。

使用class定义类

#类的最简形式
class Person():
    '着定义了一个类,但是没有什么功能'
    pass

someone = Person()

同函数一样,用pass 表示这个类是一个空类

class Person():
    def __init__(self):
        print ('女的,是个活的')
        pass

someone = Person()

当你在类声明里定义__init__() 方法时,第一个参数必须为self。尽管self 并不是一

个Python 保留字,但它很常用。没有人(包括你自己)在阅读你的代码时需要猜测使用self
的意图。

添加name 参数

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

someone = Person('xiaohong')

print(someone.name)

第一种方法__init__()方法是一种特殊的

方法,被称为类的构造函数或初始化方法,当创
建了这个类的实例时就会调用该方法

class Person():
    def __init__(self,name,age):
        self.name = name
        self.age = age
        print('__init__函数执行了')

someone = Person('xiaohong',18)

print(someone.name)
print(someone.ega)
#记录类被实例化的次数,再加一个函数用于输出我们的类的属性
class Person():
    '这是一个人的类,可以为我们实例化对象'
    person_count = 0

    def __init__(self,name,age):
        self.name = name
        self.age = age
        Person.person_count +=1

    def display_person(self):
        print('姓名:%s,年龄:%s'%(self.name,self.age))

someone1 = Person('xiaohong','18')
someone2 = Person('xiaoli','19')

print(someone.name)
print(someone.age)
print(someone.display_person())
print(someone.person_count)

print(someone1.__class__)
print(someone1.__doc__)#获取类说明

类的继承

从已有类中衍生出新的类,添加或修改部分功能。

#继承

class Car():
    def car_print(self):
        print('''I'm drive a car!!!''')

class Benz(Car):
    pass

drive_car = Car()
drive_Benz = Benz()

print(drive_car.car_print())
print(drive_Benz.car_print())

覆盖方法(重写)

#重写
class Car():
    def car_print(self):
        print('''I'm drive a car!!!''')

class Benz(Car):
    def car_print(self):
        print("I'm drive a Benz car!!!")

drive_car = Car()
drive_Benz = Benz()

drive_car.car_print()
drive_Benz.car_print()

初始化函数重写

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

class MLPerson(Person):
    def __init__(self,name):
        self.name = "我是漂亮的"+name

class SJRYPerson(Person):
    def __init__(self,name):
         self.name = "我是善解人意的"+name

someone1 = Person('laowang')
someone2 = MLPerson('xiaoli')
someone3 = SJRYPerson('xiaohong')

子类添加新方法

#子类里面添加新方法
class Car():
    def car_print(self):
        print('''I'm drive a car!!!''')

class Benz(Car):
    def car_print(self):
        print("I'm drive a Benz car!!!")
    def didi(self):
        print('didididid!!!')

drive_car = Car()
drive_Benz = Benz()

drive_car.car_print()
drive_Benz.car_print()
drive_Benz.didi()

使用super从父类得到方法

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

class QQPerson(Person):
    def __init__(self,name,QQ):
        super().__init__(name)
        self.qq = QQ

someone = QQPerson('七喜小子','777777')
someone.name
someone.qq

属性(property)

#属性 property   ‘getter setter’

class Person():
    def __init__(self,first_name,last_name):
        self.first_name = first_name
        self.last_name = last_name

    def full_name(self):
        return '%s %s'%(self.first_name,self.last_name)

someone = Person('王','小红')
someone.first_name
someone.last_name
someone.full_name()

someone.first_name = '刘'

someone.full_name = '刘小红'
someone.full_name


#使用@property
class Person():
    def __init__(self,first_name,last_name):
        self.first_name = first_name
        self.last_name = last_name
    @property
    def full_name(self):
        return '%s %s'%(self.first_name,self.last_name)

someone = Person('王','小红')
someone.first_name
someone.last_name
someone.full_name = '刘晓红'  # @property将类中方法只读属性

#@property实现getter,seter方法

class Duck():
    def __init__(self,input_name):
        self.hidden_name = input_name
    @property
    def name(self):
        print('insder the getter')
        return self.hidden_name
    @name.setter
    def name(self,input_name):
        print('insder the setter')
        self.hidden_name = input_name

duck = Duck('tanglaoye')

duck.name
duck.name ='米老鼠'
duck.hidden_name='唐老鸭'

名称重整

#名称重整
class Duck():
    def __init__(self,input_name):
        self.__name = input_name
    @property
    def name(self):
        print('insder the getter')
        return self.__name
    @name.setter
    def name(self,input_name):
        print('insder the setter')
        self.__name = input_name

duck = Duck('tanglaoye')

duck.name='唐老鸭'
duck.name
duck.__name

duck._Duck__name = '米老鼠'

方法的类型

以self 作为第一个参数的方法都是实例方法(instance method)。上面已经对实例方法做了说明,这里就不再累述。

与之相对,类方法(class method)会作用于整个类,对类作出的任何改变会对它的所有实例对象产生影响。在类定义内部,用前缀修饰符@classmethod 指定的方法都是类方法。与实例方法类似,类方法的第一个参数是类本身。在Python 中,这个参数常被写作cls,因为全称class 是保留字,在这里我们无法使用。

class Person():
    '类方法的演示'
    count = 0
    def __init__(self):
        Person.count += 1

    @classmethod
    def my_count(cls):
        print('Person类被实例化了%s次'%cls.count)

someone =Person()
someone1 =Person()
someone2 =Person()
someone.my_count()
Person.my_count()

静态方法

类定义中的方法还存在着第三种类型,它既不会影响类也不会影响类的对象。它们出现在类的定义中仅仅是为了方便,否则它们只能孤零零地出现在代码的其他地方,这会影响代码的逻辑性。这种类型的方法被称作静态方法(static method),用@staticmethod 修饰,它既不需要self 参数也不需要class 参数。

@staticmethod

class Person():
    @staticmethod
    def saying():
        print('有朋自远方来,不亦说乎!')


Person.saying()

鸭子类型

Python 对实现多态(polymorphism)要求得十分宽松,这意味着我们可以对不同对象调用同名的操作,甚至不用管这些对象的类型是什么。

#创建三个类,分别是地瓜、土豆,吃瓜群众

class TD():
    def __init__(self,person,words):
        self.person  = person
        self.words = words
    def who(self):
        return self.person
    def says(self):
        return self.words + " 。"

class DG(TD):
    def says(self):
        return self.words + "!"
class CG(TD):
    def says(self):
        return self.words + "......"

td = TD('土豆','地瓜地瓜,我是土豆')
dg = DG('地瓜','你叫谁地瓜呢')
cg = CG('吃瓜群众','哈哈哈哈哈')

td.who()
td.says()

dg.who()
dg.says()

cg.who()
cg.says()

class Duck():
    def who(self):
        return '唐老鸭'
    def says(self):
        return 'gagaga……'

duck = Duck()

#这里我们要演示一下动态类型
def who_say(obj):
    print(obj.who() ,'saying:',obj.says())

who_say(td)
who_say(dg)
who_say(cg)

who_say(duck)

这种方式有时被称作鸭子类型(duck typing),这个命名源自一句名言:

如果它像鸭子一样走路,像鸭子一样叫,那么它就是一只鸭子。

特殊方法

到目前为止,你已经能创建并使用基本对象了。现在再往深钻研一些。当我们输入像a = 3 + 8 这样的式子时,整数3 和8 是怎么知道如何实现+ 的?同样,a又是怎么知道如何使用= 来获取计算结果的?你可以使用Python 的特殊方法(specialmethod),有时也被称作魔术方法(magic method),来实现这些操作符的功能。别担心,不需要甘道夫8 的帮助,它们一点也不复杂。

这些特殊方法的名称以双下划线(__)开头和结束。没错,你已经见过其中一个:__init__,它根据类的定义以及传入的参数对新创建的对象进行初始化。假设你有一个简单的Word 类,现在想要添加一个equals() 方法来比较两个词是否一致,忽略大小写。也就是说,一个包含值'ha' 的Word 对象与包含'HA' 的是相同的。下面的代码是第一次尝试,创建一个普通方法equals()。self.text 是当前Word 对象所包含的字符串文本,equals() 方法将该字符串与word2(另一个Word 对象)所包含的字符串做比较

#传统方式
class Word():
    def __init__(self,text):
        self.text = text

    def equals(self,word2):
        return self.text.lower() == word2.text.lower()

ha1 = Word('Ha')
ha2 = Word('ha')
he = Word('he')

ha1.equals(ha2)
ha1.equals(he)
#ha1 == ha2

#魔法方法
class Word():
    def __init__(self,text):
        self.text = text

    def __eq__(self,word2):
        return self.text.lower() == word2.text.lower()

ha1 = Word('Ha')
ha2 = Word('ha')
he = Word('he')

ha1 == ha2
上一篇下一篇

猜你喜欢

热点阅读