自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Python 高級(jí)編程之面向?qū)ο?/h1>

開發(fā) 前端
如果學(xué)過java的同學(xué)再來學(xué)習(xí)python面向?qū)ο缶蜁?huì)感覺非常簡單。所以本篇文章就讓我?guī)е蠹襾韺W(xué)習(xí)一下什么是面向?qū)ο缶幊獭?/div>
一、概述

科班出身的同學(xué)應(yīng)該學(xué)過C語言、C++或者Java,編程語言一般分為兩種設(shè)計(jì)方式:面向過程編程、面向?qū)ο缶幊?,早期的編程語言多數(shù)是面向過程的,像C語言就是面向過程編程,面向過程由多個(gè)過程組合在一起,也可以理解為函數(shù)編程,而Python在設(shè)計(jì)的時(shí)候就是一種面向?qū)ο缶幊痰恼Z言,其實(shí)python把面向?qū)ο蠛喕撕芏啵绻麑W(xué)過java的同學(xué)再來學(xué)習(xí)python面向?qū)ο缶蜁?huì)感覺非常簡單。所以本篇文章就讓我?guī)е蠹襾韺W(xué)習(xí)一下什么是面向?qū)ο缶幊獭?/p>

圖片

二、面向?qū)ο蟮母拍罱榻B

類(Class)——用來描述具有相同的屬性和方法的對(duì)象的集合。它定義了該集合中每個(gè)對(duì)象所共有的屬性和方法。對(duì)象是類的實(shí)例。

類方法——類中定義的函數(shù)。

類屬性——屬性就是類變量。

方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對(duì)其進(jìn)行改寫,這個(gè)過程叫方法的覆蓋(override),也稱為方法的重寫。

實(shí)例變量——在類的聲明中,屬性是用變量來表示的,這種變量就稱為實(shí)例變量,實(shí)例變量就是一個(gè)用 self 修飾的變量。

繼承——即一個(gè)派生類(derived class)繼承基類(base class)的字段和方法。繼承也允許把一個(gè)派生類的對(duì)象作為一個(gè)基類對(duì)象對(duì)待。例如,有這樣一個(gè)設(shè)計(jì):一個(gè)Dog類型的對(duì)象派生自Animal類,這是模擬"是一個(gè)(is-a)"關(guān)系(例圖,Dog是一個(gè)Animal)。

實(shí)例化——?jiǎng)?chuàng)建一個(gè)類的實(shí)例,類的具體對(duì)象。

對(duì)象——通過類定義的數(shù)據(jù)結(jié)構(gòu)實(shí)例。對(duì)象包括兩個(gè)數(shù)據(jù)成員:屬性和方法。

對(duì)象可以分為兩個(gè)部分:一部分稱為屬性(變量),一部分稱為行為(方法)。

1)類定義

語法格式如下:

class ClassName:
    <statement-1>
    .
    .
    .
    <statement-N>

示例如下:

#!/usr/bin/python3
 
class MyClass:
    """一個(gè)簡單的類實(shí)例"""
    i = 12345
    def f(self):
        return 'hello world'
 
# 實(shí)例化類
x = MyClass()
 
# 訪問類的屬性和方法
print("MyClass 類的屬性 i 為:", x.i)
print("MyClass 類的方法 f 輸出為:", x.f())

2)類屬性

python類屬性分為:私有屬性和公開屬性,python是沒有什么修飾符的,像java就分的更細(xì)致,通過private(私有級(jí))、protected(受保護(hù)級(jí))、無前綴(默認(rèn)級(jí))、public(公開級(jí))控制權(quán)限。

  • 私有屬性(__private_attrs):兩個(gè)下劃線開頭,聲明該屬性為私有,不能在類的外部被使用或直接訪問。在類內(nèi)部的方法中使用時(shí) self.__private_attrs。
  • 公開屬性(private_attrs):不帶兩個(gè)下劃線開頭,可以在類外訪問,通過實(shí)例名訪問,也可以在類中訪問。

示例如下:

#!/usr/bin/python3
 
class JustCounter:
    __secretCount = 0  # 私有變量
    publicCount = 0    # 公開變量
 
    def count(self):
        self.__secretCount += 1
        self.publicCount += 1
        print (self.__secretCount)
 
counter = JustCounter()
counter.count()
counter.count()
print (counter.publicCount)
print (counter.__secretCount)  # 報(bào)錯(cuò),實(shí)例不能訪問私有變量

3)類方法

類方法也是分為:私有方法和公開方法,但是私有變量屬性一把通過set/get公開方法操作。示例如下:

class Parents(object):
    __name = "test"
    __age = 35
    
    # 設(shè)置姓名
    def set_name(self, name):
        self.__name = name
    
    # 獲取姓名
    def get_name(self):
        return self.__name
        
    # 設(shè)置年齡
    def set_age(self, age):
        self.__age = age
    
    # 獲取年齡
    def get_age(self):
        return self.__age

if __name__ == "__main__":
    # 實(shí)例化
    p = Parents()
    # 調(diào)用公有方法去設(shè)置屬性
    p.set_age(30)
    # 獲取私有屬性
    print(p.get_age())
    
    # 調(diào)用公有方法去設(shè)置屬性
    p.set_name("zhangsan")
    # 獲取私有屬性
    print(p.get_name())

【溫馨提示】self 的名字并不是固定的,也可以使用 this,但是最好還是按照約定使用 self。

4)構(gòu)造方法(init)

init : 構(gòu)造函數(shù),在生成對(duì)象時(shí)調(diào)用。

示例如下:

class Parents(object):
    __name = "test"
    __age = 35
    
    def __init__(self, name, age):
        self.__name = name
        self.__age = age
    
    # 設(shè)置姓名
    def set_name(self, name):
        self.__name = name
    
    # 獲取姓名
    def get_name(self):
        return self.__name
        
    # 設(shè)置年齡
    def set_age(self, age):
        self.__age = age
    
    # 獲取年齡
    def get_age(self):
        return self.__age

if __name__ == "__main__":
    # 實(shí)例化
    p = Parents(25, "lisi")
    # 獲取私有屬性
    print(p.get_age())
    # 獲取私有屬性
    print(p.get_name())

不單單有構(gòu)建函數(shù),還有其它專有的函數(shù),都是自動(dòng)去調(diào)用的:

  • __init__ : 構(gòu)造函數(shù),在生成對(duì)象時(shí)調(diào)用
  • __del__ : 析構(gòu)函數(shù),釋放對(duì)象時(shí)使用
  • repr : 打印,轉(zhuǎn)換
  • setitem : 按照索引賦值
  • getitem: 按照索引獲取值
  • len: 獲得長度
  • cmp: 比較運(yùn)算
  • call: 函數(shù)調(diào)用
  • add: 加運(yùn)算
  • sub: 減運(yùn)算
  • mul: 乘運(yùn)算
  • truediv: 除運(yùn)算
  • mod: 求余運(yùn)算
  • pow: 乘方

三、面向?qū)ο蠓庋b、繼承和多態(tài)

面向?qū)ο缶幊逃腥筇攸c(diǎn):封裝、繼承和多態(tài)。

1)封裝

就是將一個(gè)類的屬性、方法全部包裝到了一個(gè)類中。一般設(shè)置屬性為私有的,通過方法去調(diào)用,當(dāng)然有些方法只需要在類內(nèi)部使用也是可以設(shè)置成私有的方法的,通過公開的方法來供外部間接調(diào)用這些“封裝”好的屬性和方法,這就是封裝。

其實(shí)上面的示例就是很好的證明,內(nèi)部定義私有屬性,外部通過公開的方法訪問。

class Parents(object):
    __name = "test"
    __age = 35
    
    def __init__(self, name, age):
        self.__name = name
        self.__age = age
    
    # 設(shè)置姓名
    def set_name(self, name):
        self.__name = name
    
    # 獲取姓名
    def get_name(self):
        return self.__name
        
    # 設(shè)置年齡
    def set_age(self, age):
        self.__age = age
    
    # 獲取年齡
    def get_age(self):
        return self.__age

if __name__ == "__main__":
    # 實(shí)例化
    p = Parents(25, "lisi")
    # 獲取私有屬性
    print(p.get_age())
    # 獲取私有屬性
    print(p.get_name())

2)繼承

繼承就非常好理解了,其實(shí)通過字面意思理解就行了,一個(gè)類是另一個(gè)類的子類,那么這個(gè)類就可以擁有和父類一樣的屬性、方法。這就好比是現(xiàn)實(shí)當(dāng)中,兒子繼承父母的遺產(chǎn)一樣。但是需要注意的是私有屬性和私有方法是無法繼承的,其它語言也是一樣的。

在Python中,所有類默認(rèn)繼承object類,object類是頂級(jí)類或基類;其他子類叫做派生類。

示例如下:

class Animal(object):
    # 無法給繼續(xù)子類
    __name = ""
    # 可以繼承給子類
    color = ""

    def __init__(self, name, color):
        self.__name = name
        self.color = color

    # 可以繼承給子類
    def set_name(self, name):
        self.__name = name

    def get_name(self):
        return self.__name

    def set_color(self, color):
        self.color = color

    # 無法給繼續(xù)子類
    def __get_color(self):
        return self.color

class Cat(Animal):
    def __init__(self, name, color):
        self.name = name
        self.color = color
        # 調(diào)用父類構(gòu)造函數(shù)
        super(Cat, self).__init__(name, color)
        # Animal.__init__(name, color)

    # 重寫父類方法
    def set_name(self, name):
        self.name = name

    # 重寫父類方法
    def get_name(self):
        return self.name

if __name__ == "__main__":
    c = Cat("小貓", "黑色")
    # 獲取父類公開屬性
    print(c.color)

    # 調(diào)用子類方法重寫的方法
    c.set_name("大貓")

多繼承:所謂多繼承意思就是一個(gè)類同時(shí)繼承了多個(gè)父類

示例如下:

#類定義
class people:
    #定義基本屬性
    name = ''
    age = 0
    #定義私有屬性,私有屬性在類外部無法直接進(jìn)行訪問
    __weight = 0
    #定義構(gòu)造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 說: 我 %d 歲。" %(self.name,self.age))
 
#單繼承示例
class student(people):
    grade = ''
    def __init__(self,n,a,w,g):
        #調(diào)用父類的構(gòu)函
        people.__init__(self,n,a,w)
        self.grade = g
    #覆寫父類的方法
    def speak(self):
        print("%s 說: 我 %d 歲了,我在讀 %d 年級(jí)"%(self.name,self.age,self.grade))
 
#另一個(gè)類,多重繼承之前的準(zhǔn)備
class speaker():
    topic = ''
    name = ''
    def __init__(self,n,t):
        self.name = n
        self.topic = t
    def speak(self):
        print("我叫 %s,我是一個(gè)演說家,我演講的主題是 %s"%(self.name,self.topic))
 
#多重繼承
class sample(speaker,student):
    a =''
    def __init__(self,n,a,w,g,t):
        student.__init__(self,n,a,w,g)
        speaker.__init__(self,n,t)
 
test = sample("Tim",25,80,4,"Python")
test.speak()   #方法名同,默認(rèn)調(diào)用的是在括號(hào)中參數(shù)位置排前父類的方法

3)子類重新方法和super()調(diào)用父類方法

class Parent:        # 定義父類
   def myMethod(self):
      print ('調(diào)用父類方法')
 
class Child(Parent): # 定義子類
   # 重新父類方法
   def myMethod(self):
      print ('調(diào)用子類方法')
 
c = Child()          # 子類實(shí)例
c.myMethod()         # 子類調(diào)用重寫方法
super(Child,c).myMethod() #用子類對(duì)象調(diào)用父類已被覆蓋的方法

4)多態(tài)

多態(tài)首先是建立在繼承的基礎(chǔ)上的,先有繼承才能有多態(tài)。多態(tài)是指不同的子類在繼承父類后分別都重寫覆蓋了父類的方法,即父類同一個(gè)方法,在繼承的子類中表現(xiàn)出不同的形式。多態(tài)成立的另一個(gè)條件是在創(chuàng)建子類時(shí)候必須使用父類new子類的方式。

示例如下:

#!/usr/bin/env python3
# -*- coding:utf-8 -*-

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def print_age(self):
        print("%s's age is %s" % (self.name, self.age))

class Man(Person):
    def print_age(self):
        print("Mr. %s's age is %s" %(self.name, self.age))
class Woman(Person):
    def print_age(self):
        print("Ms. %s's age is %s" %(self.name, self.age))

def person_age(person):
    person.print_age()

if __name__ == "__main__":
    person = Person("kevin", 23)
    man = Man("Bob", 33)
    woman = Woman("Lily", 28)
    person_age(person)
    person_age(man)
    person_age(woman)

【總結(jié)】其實(shí)多態(tài)也很好理解,就是將不同的對(duì)象傳到相同的函數(shù),表現(xiàn)不同的形態(tài),這就是多態(tài)。

責(zé)任編輯:武曉燕 來源: 大數(shù)據(jù)與云原生技術(shù)分享
相關(guān)推薦

2009-10-21 18:09:12

VB入門教程

2011-07-14 17:37:02

C++面向?qū)ο缶幊趟枷?/a>

2011-07-14 17:24:10

C++面向?qū)ο笏枷?/a>

2011-08-04 11:04:14

Objective-C 面向?qū)ο? 繼承

2023-03-10 07:43:50

UML圖OOA面向?qū)ο?/a>

2019-03-26 10:50:22

Python面向?qū)ο?/a>編程語言

2023-01-10 09:06:17

2023-12-11 15:32:30

面向?qū)ο缶幊?/a>OOPpython

2010-07-15 13:56:24

面向?qū)ο?/a>面向過程

2017-04-21 09:07:39

JavaScript對(duì)象編程

2012-01-17 09:34:52

JavaScript

2023-09-27 23:28:28

Python編程

2010-11-17 11:31:22

Scala基礎(chǔ)面向?qū)ο?/a>Scala

2022-07-30 23:41:53

面向過程面向?qū)ο?/a>面向協(xié)議編程

2010-02-26 14:40:15

Python應(yīng)用程序

2012-12-13 11:01:42

IBMdW

2012-02-27 09:30:22

JavaScript

2020-12-24 08:36:14

JavaJava基礎(chǔ)

2022-01-05 08:56:20

Go火焰圖編程

2023-07-06 08:31:50

Python對(duì)象編程
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)