1. 程式人生 > >python 類的例項方法,靜態方法,類方法辨析和例項講解

python 類的例項方法,靜態方法,類方法辨析和例項講解

        我們知道在python的類裡面可以定義三種類型的方法:

class A(object):
    # 例項方法
   def foo(self,x):
        print "executing foo(%s,%s)"%(self,x)
    # 類方法
    @classmethod
    def class_foo(cls,x):
        print "executing class_foo(%s,%s)"%(cls,x)
    # 靜態方法
    @staticmethod
    def static_foo(x):
        print "executing static_foo(%s)"%x

a = A()

        這三個方法究竟有什麼不同呢?一圖勝千言,圖片來源

        可以看到,例項是三種方法都可以呼叫的,而類只可以呼叫兩種。所以這些方法的使用就是看你是否要讓類不需要通過例項來呼叫方法,而類方法和靜態方法的區別就是你是否要在該方法引導類的屬性或者其他類的類方法。

        看過flask web development 這本書的同學應該記得這一段程式碼:

from config import config
# ...

config[config_name].init_app(app)

        其中config是一個字典,在config.py中定義好的,其鍵所對的是在config.py中定義好的類,程式碼如下:
class Config:
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'you will never know'
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True
    FLASKY_MAIL_SUBJECT_PREFIX = '[lulalula]'
    FLASKY_MAIL_SENDER = 'flasky Admin <
[email protected]
>'     FLASKY_ADMIN = os.environ.get('FLASKY_ADMIN')     FLASKY_POSTS_PER_PAGE = 10     FLASKY_FOLLOWERS_PER_PAGE = 10     FLASKY_COMMENTS_PER_PAGE = 10     SQLALCHEMY_RECORD_QUERIES = True     FLASKY_SLOW_DB_QUERY_TIME = 0.5     # init_app函式的函式體為空只是預留一個方法,方便呼叫     @staticmethod     def init_app(app):         pass # ... class ProductionConfig(Config):     SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URL') or \         'sqlite:///' + os.path.join(basedir, 'data.sqlite')     @classmethod     def init_app(cls, app):         Config.init_app(app)         import logging         from logging.handlers import SMTPHandler         credentials = None         secure = None         if getattr(cls, 'MAIL_USERNAME', None) is not None:             credentials = (cls.MAIL_USERNAME, cls.MAIL_PASSWORD)             if getattr(cls, 'MAIL_USE_TLS', None):                 secure = ()         mail_handler = SMTPHandler(             mailhost=(cls.MAIL_USERNAME, cls.MAIL_PASSWORD),             fromaddr=cls.FLASKY_MAIL_SENDER,             toaddrs=[cls.FLASKY_ADMIN],             subject=cls.FLASKY_MAIL_SUBJECT_PREFIX + 'Application Error',             credentials=credentials,             secure=secure)         mail_handler.setLevel(logging.Error)         app.logger.addHandler(mail_handler)(Config):     SQLALCHEMY_DATABASE_URI = os.environ.get('DEV_DATABASE_URL') or \         'sqlite:///' + os.path.join(basedir, 'data.sqlite') config = {     'development': DevelopmentConfig,     'testing': TestingConfig,     'production': ProductionConfig,     'default': DevelopmentConfig }
        可以知道如果config_name = 'production'的時候就會呼叫ProductionConfig這個類,而ProductionConfig繼承與Config,所以有Config的所有屬性。如果只是為了讓類呼叫init_app方法,大可以像Config用靜態方法,但是可以看到init_app裡面呼叫了很多屬性,所以只能用類方法來實現。這樣我們就可以理清這三者之間的關係,和恰當的使用者這三種方法了。

相關推薦

Python-變數成員變數靜態變數方法靜態方法例項方法普通函式

#coding:utf-8 class class_name(object): class_var = 'I am a class variable' #類變數 def __init__(self): self.instance_

python 例項方法靜態方法方法辨析例項講解

        我們知道在python的類裡面可以定義三種類型的方法: class A(object): # 例項方法   def foo(self,x): print "executing foo(%s,%s)"%(self,x) #

區別JS中靜態方法靜態變數例項方法例項變數

1.類的靜態方法     先來段程式碼之後分析 // JS類靜態函式 function BaseClass() { } // 類新增add函式 BaseClass.add = function()

php中常量 const屬性靜態屬性靜態的函數方法

tco 屬性 japan public elf cti 變量名 pub define <?php//php中的常量define(‘MYNUM‘, 2000);echo MYNUM.‘<br>‘;if(!defined(‘MYNUM‘)){ defin

2018-07-04-Python全棧開發day25-靜態屬性、方法靜態方法以及組合

之前 cls school 直觀 imp 學校 int nba while 1.靜態屬性property   作用:改變類中方法的調用方式,不需要加括號,看起來和數據屬性的調用方式相同    class Fangjian(): tag=‘888‘ def

android ,java中的記憶體畫分:棧靜態常量去方法區。。。簡單梳理

記憶體的劃分整體說來有以下六種: 1. 暫存器(register)。------最快的儲存區, 由編譯器根據需求進行分配,我們在程式中無法控制. 2. 棧(stack)。------存放基本

成員變數靜態變數靜態靜態方法執行順序

測試案例一 /** * @author 歡迎加入Java技術交流群:646766275 * */ public class Test { static int x = 10;

python寫簡單的web靜態伺服器對socket的深入理解。

import socket from multiprocessing import Process import time #...使用socket建立簡單的靜態伺服器 def func1(sock): # 子程序實現的功能 read_data = sock.recv(2

舉例詳解java例項變數靜態變數區域性變數

public class Variable { public int m,n;//對子類可見的例項變數 private double k;//只對本類可見的例項變數,一般情況下,設為私有,通過使用訪問修飾符來被子類使用。 public static String P;//靜態變數(

不同子擁有基的不同的靜態成員變數的方法

大家都知道所有子類物件(不管是相同的子類或是不同的子類)擁有基類的相同靜態成員變數。因為靜態變數是屬於類的,而不是屬於某個物件的。所以如下程式碼: #include <iostream> using namespace std; class Base { pu

靜態變數的初始化靜態變數在內定義外進行初始化。

靜態變數的初始化,只能在類外進行,靜態變數在類外初始化要加上::,同時不能加上static 關鍵了。 為什麼不在類內進行初始化,因為靜態變數是公共的,不依賴與每個物件,所以它是獨立的,所以靜態變數

Nginx配置:訪問日誌日誌切割靜態文件不記錄日誌過期時間

Nginx配置 訪問日誌 一、訪問日誌 1、查看Nginx日誌格式 [root@zhulinux-02 ~]# grep -A2 log_format /usr/local/nginx/conf/nginx.conf log_format combined_realip ‘$remote_ad

nginx訪問日誌日誌切割靜態文件不記錄日誌過期時間

nginx訪問日誌 日誌切割 靜態文件不記錄日誌 靜態文件不記錄過期時間 nginx訪問日誌 日誌格式vim /usr/local/nginx/conf/nginx.conf //搜索log_format 編輯虛擬主機配置文件,配置日誌格式,(註意日誌後面的名稱與主配置文件保持一致)驗證訪問其

91.Nginx配置:訪問日誌日誌切割靜態文件不記錄日誌過期時間

Nginx配置:訪問日誌日誌切割靜態一、訪問日誌 1、查看Nginx日誌格式 [root@sdwaqw ~]# grep -A2 log_format /usr/local/nginx/conf/nginx.conflog_format combined_realip ‘$remote_addr $http_

12.10-12.12 Nginx的訪問日誌日誌切割靜態文件不記錄日誌過期時間

nginx訪問日誌12.10 Nginx訪問日誌12.11 Nginx日誌切割12.12 靜態文件不記錄日誌和過期時間12.10 Nginx訪問日誌1 打開配置文件,搜索/log_format,查看日誌文件格式。或者直接grep過濾出來[root@AliKvn vhost]# grep -A2 log_for

java中代理靜態代理動態代理以及spring aop代理方式實現原理統一彙總 Spring中AOP的兩種代理方式(Java動態代理CGLIB代理)

若代理類在程式執行前就已經存在,那麼這種代理方式被成為 靜態代理 ,這種情況下的代理類通常都是我們在Java程式碼中定義的。 通常情況下, 靜態代理中的代理類和委託類會實現同一介面或是派生自相同的父類。 一、概述1. 什麼是代理我們大家都知道微商代理,簡單地說就是代替廠家賣商品,廠家“委託”代理為

C語言那年踩過的坑--區域性變數靜態變數全域性變數在記憶體中存放的位置

  先看幾個概念: 1、bss是英文block started by symbol的簡稱,通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域,在程式載入時由核心清0。bss段屬於靜態記憶體分配。它的初始值也是由使用者自己定義的連線定位檔案所確定,使用者應該將它定義在可讀寫的ram區內,源程式中使用m

Spring裡的aop實現方式原始碼分析 java中代理靜態代理動態代理以及spring aop代理方式實現原理統一彙總

使用"橫切"技術,AOP把軟體系統分為兩個部分:核心關注點和橫切關注點。業務處理的主要流程是核心關注點,與之關係不大的部分是橫切關注點。橫切關注點的一個特點是,他們經常發生在核心關注點的多處,而各處基本相似,比如許可權認證、日誌、事務。AOP的作用在於分離系統中的各種關注點,將核心關注點和橫切關注點分離開來。

Mybatis(四):MyBatis核心元件介紹原理解析原始碼解讀 java中代理靜態代理動態代理以及spring aop代理方式實現原理統一彙總

Mybatis核心成員 Configuration        MyBatis所有的配置資訊都儲存在Configuration物件之中,配置檔案中的大部分配置都會儲存到該類中 SqlSession         &

java代理模式學習靜態代理JDK動態代理CGLIB動態代理

                java代理模式學習,靜態代理,JDK動態代理,CGLIB動態代理   一、理解代理 1、代理,Proxy 。意思是:本來該你做的事兒,別人代替你去做。 比如說:即將