程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

【python學習11】類和對象的再次深入

編輯:Python

                      *7、類的賦值、淺拷貝、深拷貝 

(一)封裝 

 

 

self.__age=age:  self.__age前面有兩個"_",說明該屬性不能在類對象外部被訪問 

(二)繼承

子類中的初始化方法中有 super().__init__(name,age)  是調用父類的初始化方法給屬性賦值,scorestudent  類中自己的屬性,使用self進行賦值

class Person:
def __init__(self,name,age):
self.name=name
self.age=age
def info(self):
print(self.name,self.age)
#定義子類
class Student(Person):
def __init__(self,name,age,score):
super().__init__(name,age) #調用父類的初始化方法給name,age賦值
self.score=score #score是該類中自己的屬性,故用self賦值
class Teacher(Person):
def __init__(self,name,age,teacheryear):
super().__init__(name,age) #調用父類的初始化方法給name,age賦值
self.teacheryear=teacheryear #teacheryear是該類中自己的屬性,故用self賦值
stu=Student("張三",18,95)
teacher=Teacher("王梅",32,8)
stu.info()
teacher.info()

python 中也可以實現 多繼承

class A(object):
pass
class B(object):
pass
class C(A,B): #C類同時繼承了A類,B類
pass

(三)方法重寫

方法重寫:①可在子類中對方法重新編寫

                  ②子類中重寫後的方法可用 super().xx()調用父類中原始的方法 (和子類中的初始化方法一樣用super().__init__(name,age)語句調用父類中的初始化方法)

                 ③重寫方法時會出現箭頭顯示overrides method in object

class Person: #父類
def __init__(self,name,age):
self.name=name
self.age=age
def info(self):
print(self.name,self.age)
#定義子類
class Student(Person):
def __init__(self,name,age,score):
super().__init__(name,age) #調用父類的初始化方法給name,age賦值
self.score=score #score是該類中自己的屬性,故用self賦值
def info(self):
super().info() #重寫子類中的info方法,若還想用父類的方法要寫super().info()
print(self.score) #重寫方法後添加的語句
class Teacher(Person):
def __init__(self,name,age,teacheryear):
super().__init__(name,age) #調用父類的初始化方法給name,age賦值
self.teacheryear=teacheryear #teacheryear是該類中自己的屬性,故用self賦值
stu=Student("張三",18,95)
teacher=Teacher("王梅",32,8)
stu.info()
teacher.info()

(四)object類

__str__()方法沒搞懂

寫完類之後,通常對 __str__()方法進行重寫

class Student: #若未見說明則繼承object類
pass
stu=Student()
print(dir(stu)) #內置函數dir()查看指定對象所有屬性

 (五)多態的實現

class Animal(object):
def eat(self):
print("動物會吃")
class Dog(Animal):
def eat(self):
print("狗吃骨頭")
class Cat(Animal):
def eat(self):
print("貓吃魚")
class Person(object):
def eat(self):
print("人吃任何")
def fun(obj):
obj.eat()
fun(Cat())
fun(Dog())
fun(Animal())
fun(Person()) #不用關心Person時誰的子類,只關心Person是否具有eat方法

不用關心上面代碼中 Person 是誰的子類,只關心Person是否具有eat方法

JAVA是靜態語言,Python是動態語言

(六)特殊屬性和特殊方法 

以兩個下劃線"__"開始和兩個下劃線"__"結束的屬性或方法,是特殊的屬性或方法 

1,特殊屬性

類對象的__dict__屬性包括該類的所有屬性和方法的字典實例對象的__dict__屬性包括該實例對象的所有屬性的字典

print(x.__class__) #屬性__class__,輸出實例對象x所屬的類
print(C.__bases__) #屬性__bases__,輸出C類所繼承的多個父類並將父類放在元組中
print(C.__mro__) #屬性__mro__,輸出可查看類的層次結構,即子類父類和祖父類
print(A.__subclasses__) #屬性__subclasses__,查看A類的子類並把子類放在列表中

2,特殊方法

若想讓兩個實例對象的某些屬性相加,則需要在類中重寫__add__()方法(理解表中對應內容)

若想統計實例對象某些屬性的長度,則需要在類中重寫__len__()方法(理解表中對應內容)

(1)__new__與__init__演示創建對象的過程

①方框中的9360,7104是輸出的地址;箭頭表示傳參的過程   

②由上圖可知先用__new__創建對象,再用__init__初始化對象

③上圖__new__方法中用了super().__new__(cls),使用父類object類中的創建對象的方法傳參cls

(七)類的賦值、淺拷貝、深拷貝

淺拷貝:子對象是指 該源對象中包括的其他類的實例對象,源對象和拷貝對象引用同一個

              子對象

深拷貝:會拷貝對象中包含的子對象,源對象和拷貝對象的所有子對象不相同


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved