屬性查詢與繫結方法

2021-09-25 00:25:20 字數 4383 閱讀 9459

類有兩種屬性:資料屬性和函式屬性

1、類的資料屬性是所有物件共享的

class luffystudent:

school='luffycity'

def learn(self):

print('is learning')

def eat(self):

print('is sleeping')

#後產生物件

stu1=luffystudent()

stu2=luffystudent()

stu3=luffystudent()

print(id(stu1.school))

print(id(stu2.school))

print(id(stu3.school))

# 43496496

# 43496496

# 43496496

2、類的函式資料是繫結給物件用的,稱為繫結到物件的方法

#後產生物件

stu1=luffystudent()

stu2=luffystudent()

stu3=luffystudent()

#類的函式屬性是繫結給物件使用的,obj.method稱為繫結方法,記憶體位址都不一樣

print(stu1.learn())

print(stu2.learn())

print(stu3.learn())

# >

# >

# >

#ps:id是python的實現機制,並不能真實反映記憶體位址,如果有記憶體位址,還是以記憶體位址為準

在obj.name會先從obj自己的命名空間裡找name,找不到則去類中找,類也找不到就找父類...最後都找不到就丟擲異常

定義類並例項化出三個物件

class luffystudent:

school='luffy'

def __init__(self,name,age):

self.name = name

self.age = age

def eat(self):

print('%s is eating' %self.name)

def sleep(self):

print('%s is sleeping' %self.name)

def __del__(self):

print("running del method, this person must be died.")

# 後產生物件

stu1=luffystudent('alex',18)

stu2=luffystudent('li',28)

stu3=luffystudent('hy',38)

stu1.eat()

stu2.eat()

stu3.eat()

# alex is eating

# li is eating

# hy is eating

強調:繫結到物件的方法的特殊之處在於,繫結給誰就由誰來呼叫,誰來呼叫,就會將『誰』本身當做第乙個引數傳給方法,即自動傳值(方法__init__也是一樣的道理)

stu1.eat() # 等同於luffystudent.eat(stu1)

stu2.eat() # 等同於luffystudent.eat(stu1)

stu3.eat() # 等同於luffystudent.eat(stu1)

注意:繫結到物件的方法的這種自動傳值的特徵,決定了在類中定義的函式都要預設寫乙個引數self,self可以是任意名字,但是約定俗成地寫出self。

python中一切皆為物件,且python3中類與型別是乙個概念,型別就是類

#型別dict就是類dict

>>> list

#例項化的到3個物件l1,l2,l3

>>> l1=list()

>>> l2=list()

>>> l3=list()

>>> l1

[3]>>> l2

>>> l3

>>> l3

[111]

class mysqlhandler:

def __init__(self,host,port,db,charset='utf8'):

self.host=host

self.port=port

self.db=db

self.charset=charset

self.conn=self.connect(self.host,self.port,self.db,self.charset)

def exc1(self,sql):

return self.conn.execute(sql)

def exc2(self,sql):

return self.conn.call_proc(sql)

def _connect(self,host,port,db,charset):

print('connect %s,%s,%s,%s' %(host,port,db,charset))

obj=mysqlhandler('127.0.0.1',3306,'db1')

obj.exc1('select * from tb1;')

obj.exc2('mycall')

練習1:編寫乙個學生類,產生一堆學生物件

要求:有乙個計數器(屬性),統計總共例項了多少個物件

class student(object):

count = 0

def __init__(self,name):

self.name = name

student.count+=1

def learn(self):

print('%s is learning'%self.name)

s1 = student('x1')

print(s1.count) # 1

s2 = student('x2')

print(s2.count) # 2

s3 = student('x3')

print(s3.count) # 3

練習2:模仿王者榮耀定義兩個英雄類

要求:英雄需要有暱稱、攻擊力、生命值等屬性;

例項化出兩個英雄物件;

英雄之間可以互毆,被毆打的一方掉血,血量小於0則判定為死亡。

class heroa:

camp = 'a'

def __init__(self,name,life_vale,aggresivity):

self.name = name

self.life_value = life_vale

self.aggresivity = aggresivity

def attack(self,enemy):

if enemy.life_value == 0:

print('%s is dead' %enemy.name)

enemy.life_value -= self.aggresivity

class herob:

camp ='b'

def __init__(self,name,life_vale,aggresivity):

self.name = name

self.life_value = life_vale

self.aggresivity = aggresivity

def attack(self,enemy):

if enemy.life_value == 0:

print('%s is dead' % enemy.name)

enemy.life_value -= self.aggresivity

a = heroa('a1',160,50)

b = herob('b1',150,40)

while b.life_value > 0:

a.attack(b)

print('b life', b.life_value)

b.attack(a)

print('a life', a.life_value)

a.attack(b)

#結果b life 100

a life 120

b life 50

a life 80

b life 0

a life 40

b1 is dead

python 動態繫結屬性與方法

動態繫結屬性與方法的意思就是在本沒有這個屬性與方法的例項物件中新增這個屬性與方法。具體操作如下 class stduent def init self,name,age self.name name self.age age defeat self print self.name 正在吃飯 std1...

3 屬性查詢與方法

屬性查詢 類有兩種屬性 資料屬性和函式屬性 1.資料屬性是共享的,資料屬性公用一塊記憶體 2.類的函式資料是繫結給物件用的,稱為繫結到物件的方法 class student mingzu 漢族 資料屬性 def init self,name,age,函式屬性 self.name name self....

繫結方法與非繫結方法

特性 繫結給誰就應該由誰來呼叫,誰來呼叫就會將誰當作第乙個引數自動傳入 精髓在於自動傳值 繫結方法分為兩類 1.1 繫結給物件方法 在類內部定義的函式 沒有被任何裝飾器修飾的 預設就是繫結給物件用的 1.2 繫結給類的方法 在類內部定義的函式如果被裝飾器 classmethod裝飾,那麼則是繫結給類...