Python之關於類變數的兩種賦值區別詳解

2022-09-27 05:30:12 字數 2500 閱讀 8968

我就廢話不多說了,還是直接看**吧!

# -*- coding:utf-8 -*-

#面試題,寫乙個方法,將一行字串中所有的單詞數量統計出來

class person(object):

tag = "hello"

p1 = person()

p2 = person()

print p1.tag #第一種賦值方式

print p2.tag

print person.tag #第二種賦值方式

p1.tag = "damn it"

print p1.tag

print p2.tag

print person.tag

輸出結果:可以看到,只有p1的tag,被賦值成了新的"damn it"

hello

hello

hello

damn it

hello

hello

如何將所有物件引用的類變數都賦值成同乙個值呢?

person.tag = "damn it"

輸出結果:完美解決問題

hello

hello

hello

damn it

damn it

damn it

補充知識:python類,賦值,命名空間

python中的類相當於乙個命名空間,object.attr 就是乙個向上爬屬性的過程

屬性:__dict__ , __class__ , __bases__

__dict__: 例項或類或模組的屬性 , __class__ 例項對應的類物件,__bases__(元組):父類/超類

爬屬性:

def findattr(obj , attr):

if attr in obj.__dict__:

return obj.__dict__[attr]

cls = obj.__class__

if attr in cls.__dictxmkxdqizpj__:

return cls.__dict__[attr]

for super_cls in cls.__bases__:

if attr in super_cls.__dict__:

return super_cls.__dict__[attr]

return none

爬類:def classtree(cls,indent):

prxmkxdqizpjint('.'*indent + cls.__name__)

for super_cls in cls.__bases__:

classtree程式設計客棧(super_cls,indent+4)

賦值方式:

class test:

static_var = 1 #類屬性相當與c++靜態成員變數

def assign(self):

self.x = 1 #物件屬性賦值

t = test()

t.x = 2 #也可以這樣 ,直接賦值

t.__dict__['x'] = 3 #也可以這樣 , __dict__是物件空間詞典,每個物件乙份,類物件/模組也有

test.add_static_var = 5 #也可以樣新增乙個類屬性

類方法呼叫 , 常用的方式object.method() ,在python中擴充套件 class.method(object) ,兩者相同

test.assign(t)

print(t.x)

當object.method() 時,object被傳入method(self)中的第乙個引數.class.method(object) 需要手動傳入

命名空間:

x = 0

def print_global():

print(x) #列印全域性

def print_local():

x = 1

print(x) #本地變數

class a:

x = 2 #類屬性==c++靜態成員變數 , print a.x

def m(self):

x = 3 #本地變數

self.x = 4 #物件屬性

def change_global():

global x #修改全域性變數,否則x = 100 ,是增加乙個本地變數

x = 100

def print_enclosing():

x = 200

def nested():

print(x) #在閉包中引用本地變數

def change_in_enclosing():

x = 1

def nwww.cppcns.comested():

nonlocal x

x = 2 #在閉包中改變本地變數, 如沒有nonlocal x , 在又新增乙個本地變數

本文標題: python之關於類變數的兩種賦值區別詳解

本文位址: /jiaoben/python/302819.html

類的兩種引入方式

一種是通過 import方式引入 另一種是通過 class引入 這兩種的方式的區別在於 1 import方式會包含被引用類的所有資訊,包括被引用類的變數和方法 class方式只是告訴編譯器在a.h檔案中 b b 只是類的宣告,具體這個類裡有什麼資訊,這裡不需要知道,等實現檔案中真正要用到時,才會真正...

關於C 兩種排序

學習了選擇排序與氣泡排序後,以我目前的水平認為,選擇排序和氣泡排序的結果上,其實都是將整數型或浮點型的數排成有序數列的演算法,即將數從大到小或從小到大排列。但是,它們使數排成有序數列的過程,是有不同的,於是我就有個疑問,它們實現排序的效率有何不同呢。以下分別是是關於選擇排序與氣泡排序的 選擇排序 i...

關於兩種限流模式

流量預警和限流方案中,比較常用的有兩種。第一種滑窗模式,通過統計一段時間內的訪問次數來進行控制,訪問次數達到的某個峰值時進行限流。第二種為併發使用者數模式,通過控制最大併發使用者數,來達到流量控制的目的。下面來簡單分析下兩種的優缺點。1 滑窗模式 模式分析 在每次有訪問進來時,我們判斷前n個單位時間...