*7、類的賦值、淺拷貝、深拷貝
self.__age=age: self.__age前面有兩個"_",說明該屬性不能在類對象外部被訪問
子類中的初始化方法中有 super().__init__(name,age) 是調用父類的初始化方法給屬性賦值,score 是 student 類中自己的屬性,使用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()
__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是動態語言
以兩個下劃線"__"開始和兩個下劃線"__"結束的屬性或方法,是特殊的屬性或方法
類對象的__dict__屬性包括該類的所有屬性和方法的字典,實例對象的__dict__屬性包括該實例對象的所有屬性的字典
print(x.__class__) #屬性__class__,輸出實例對象x所屬的類
print(C.__bases__) #屬性__bases__,輸出C類所繼承的多個父類並將父類放在元組中
print(C.__mro__) #屬性__mro__,輸出可查看類的層次結構,即子類父類和祖父類
print(A.__subclasses__) #屬性__subclasses__,查看A類的子類並把子類放在列表中
若想讓兩個實例對象的某些屬性相加,則需要在類中重寫__add__()方法(理解表中對應內容)
若想統計實例對象某些屬性的長度,則需要在類中重寫__len__()方法(理解表中對應內容)
①方框中的9360,7104是輸出的地址;箭頭表示傳參的過程
②由上圖可知先用__new__創建對象,再用__init__初始化對象
③上圖__new__方法中用了super().__new__(cls),使用父類object類中的創建對象的方法傳參cls
淺拷貝:子對象是指 該源對象中包括的其他類的實例對象,源對象和拷貝對象引用同一個
子對象
深拷貝:會拷貝對象中包含的子對象,源對象和拷貝對象的所有子對象不相同