網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
Python對(duì)象動(dòng)態(tài)的增加屬性和方法
前面我們了解到數(shù)據(jù)封裝、繼承和多態(tài)只是面向?qū)ο蟪绦蛟O(shè)計(jì)中最基礎(chǔ)的3個(gè)概念。
在Python中,面向?qū)ο筮€有很多高級(jí)特性,允許我們寫出非常強(qiáng)大的功能。
python是動(dòng)態(tài)語(yǔ)?,動(dòng)態(tài)編程語(yǔ)?是?級(jí)程序設(shè)計(jì)語(yǔ)?的?個(gè)類別,在計(jì)算機(jī)科學(xué)領(lǐng)域已被?泛應(yīng)?。它是?類在 運(yùn)?時(shí)可以改變其結(jié)構(gòu) 的語(yǔ)? :例如新的函數(shù)、對(duì)象、甚?代碼可以被引進(jìn),已有的函數(shù)可以被刪除或是其他結(jié)構(gòu)上的變化。
動(dòng)態(tài)語(yǔ)??前?常具有活?,例如,我們現(xiàn)在創(chuàng)建一個(gè)人的類,在這個(gè)類里面,定義了兩個(gè)初始屬性name和age
# -*- coding: utf-8 -*-
class Person(object):
def __init__(self, name=None, age=None):
self.name = name
self.age = age
現(xiàn)在我們實(shí)例化一個(gè)人,P對(duì)象對(duì)應(yīng)的就是張三這個(gè)人,我們傳入p對(duì)象的兩個(gè)屬性,姓名和年齡,這個(gè)p對(duì)象就好像是自己,我們把自己的姓名和年齡的屬性,掛在自己身上。
>>> p = Person('張三', 20)
接著,此時(shí)出現(xiàn)問(wèn)題,若我不知道不認(rèn)識(shí)這個(gè)人,例如我在人這個(gè)一個(gè)系統(tǒng)里面,茫茫人海無(wú)意間看到了有這個(gè)p對(duì)象,有點(diǎn)好奇,或者需要查到他一些資料,給到他,但我不熟悉有這個(gè)人,我想看看這個(gè)人是男是女
>>> p.name
張三
>>> # 如果我們這里寫上p.sex就會(huì)存在問(wèn)題,因?yàn)闆](méi)有這個(gè)人的性別信息
>>> p.sex = '男'
>>> p.sex
男
這時(shí)候就發(fā)現(xiàn)問(wèn)題了,我們定義的類??沒(méi)有sex這個(gè)屬性啊!怎么回事呢?這就是動(dòng)態(tài)語(yǔ)?的魅?和坑! 這? 實(shí)際上就是 動(dòng)態(tài)給實(shí)例綁定屬性!
在運(yùn)行的過(guò)程中給類綁定屬性,看下面的例子
>>> p2 = Person('李四', 20)
>>> p2.sex
Traceback (most recent call last):4?
?? ?.......?
AttributeError: Person instance has no attribute 'sex'
>>>
我們嘗試打印P2.sex,發(fā)現(xiàn)報(bào)錯(cuò),P2沒(méi)有sex這個(gè)屬性!---- 給P1這個(gè)實(shí)例綁定屬性對(duì)P2這個(gè)實(shí)例不起作?! 那我們要給所有的Person的實(shí)例加上 sex屬性怎么辦呢? 答案就是直接給Person綁定屬性!
>>> Person.sex = None ?# 給類Person添加一個(gè)屬性
>>> p2 = Person('李四', 20)
>>> print(p.sex) ?# 如果P1這個(gè)實(shí)例對(duì)象中沒(méi)有sex屬性的話,那么就會(huì)訪問(wèn)它的類屬性?
None ?# 可以看到?jīng)]有出現(xiàn)異常?
>>>
我們直接給Person綁定sex這個(gè)屬性,重新實(shí)例化P2后,P2就有sex這個(gè)屬性了! 那么function呢?怎么綁定?
# -*- coding: utf-8 -*-
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
def eat(self):
print('吃食物')
# 單獨(dú)定義一個(gè)方法
def test(self, work):
print('%s在%s' % (self.name, work))
>>> P = Person("小明", 24)?
>>> p.eat()?
eat food?
>>> p.run()?
Traceback (most recent call last):?
......?
AttributeError: Person instance has no attribute 'run'?>>> import types
>>> p.test = types.MethodType(test, p)
>>> p.test('學(xué)習(xí)')
小明在學(xué)習(xí)
既然給類添加?法,是使? 類名.?法名 = xxxx
那么給對(duì)象添加?個(gè)?法也是類似的 對(duì)象.?法名 = xxxx
看完整代碼,對(duì)類方法,方法,增加綁定:
# -*- coding: utf-8 -*-
import types
class Person(object):
num = 0 # 類屬性
def __init__(self, name, age):
self.name = name
self.age = age
# 定義一個(gè)函數(shù)
def eat(self, food):
print(self.name + '在吃' + food)
# 定義一個(gè)類方法
@classmethod
def cm(cls):
print('這是給Person類動(dòng)態(tài)賦予一個(gè)類函數(shù)')
# 定義一個(gè)靜態(tài)方法
@staticmethod
def sm():
print('這是給Person類動(dòng)態(tài)賦予一個(gè)一個(gè)靜態(tài)函數(shù)')
if __name__ == '__main__':
p = Person('張三', 33) # 創(chuàng)建對(duì)象
Person.address = '北京' # 類屬性
# 1.可以給 對(duì)象p 動(dòng)態(tài)的賦予一個(gè)對(duì)象屬性
p.sex = '男' # 對(duì)象屬性
# 2.可以給對(duì)象 p 動(dòng)態(tài)賦予一個(gè)新的對(duì)象函數(shù)
p.eat = types.MethodType(eat, p)
print(p.eat('牛奶'))
# 3. 給Person類動(dòng)態(tài)賦予一個(gè)類函數(shù)
Person.cm = cm
# 調(diào)用類方法
print(Person.cm())
# 4.給Person類動(dòng)態(tài)賦予一個(gè)靜態(tài)函數(shù)
Person.sm = sm
# 調(diào)用靜態(tài)方法
print(Person.sm())
那既然有增加,就有刪除
刪除對(duì)象與屬性的方法
del 對(duì)象.屬性名
delattr(對(duì)象, “屬性名”)
我們知道,正常情況下,當(dāng)我們定義了一個(gè)class,創(chuàng)建了一個(gè)class的實(shí)例后,我們可以給該實(shí)例綁定任何屬性和方法,這就是動(dòng)態(tài)語(yǔ)言的靈活性。先定義class:然后嘗試給實(shí)例綁定一個(gè)屬性,還可以綁定一個(gè)方法,但是一個(gè)實(shí)
例方法對(duì)另一個(gè)實(shí)例不起作用,那就得給類整個(gè)類綁定一個(gè)方法或?qū)傩裕@樣所有的實(shí)例都可以調(diào)用
需要注意的是我們的動(dòng)態(tài)語(yǔ)言在運(yùn)行后還能修改的,但是靜態(tài)語(yǔ)言是不可以的,這就會(huì)造成不嚴(yán)謹(jǐn)。
原文鏈接:https://aweia.blog.csdn.net/article/details/125562956
相關(guān)推薦
- 2022-05-08 Windows?Bat腳本實(shí)現(xiàn)定時(shí)重啟應(yīng)用程序的項(xiàng)目實(shí)踐_DOS/BAT
- 2023-03-15 Android?flutter?Dio鎖的巧妙實(shí)現(xiàn)方法示例_Android
- 2022-03-17 Android自定View實(shí)現(xiàn)滑動(dòng)驗(yàn)證效果的代碼_Android
- 2022-04-02 C#實(shí)現(xiàn)NPOI的Excel導(dǎo)出詳解_C#教程
- 2022-09-30 C#?wpf?Bitmap轉(zhuǎn)換成WriteableBitmap的方法_C#教程
- 2023-07-07 React中useState的setState方法請(qǐng)求了好多次
- 2022-04-01 C#對(duì)Xamarin框架進(jìn)行數(shù)據(jù)綁定_C#教程
- 2023-01-09 Kotlin協(xié)程的線程調(diào)度示例詳解_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支