類:抽象的概念;是屬性和方法的集合。類中的函數叫方法。
對象instance、object
對象是類的具象,是一個實體。對象是數據和操作的封裝。
面向對象3要素:
1.封裝:
2.繼承:
多復用,繼承來的就不用自己寫了
多繼承少修改。
3.多態:
面向對象編程最靈活的地方,動態綁定。
類:
必須使用class關鍵字。
類名必須使用大駝峰命名。
類定義完成后,就產生了一個類對象,綁定到了ClassName上。
類對象:類的定義就會生成一個類對象。
類的屬性:類定義中的變量和類中定義的方法都是類的屬性。
類變量:x是類MyClass的變量。
class MyClass: """help myclass""" x=123 def foo(self): print(self.x) print(MyClass) print(MyClass.__name__) print(MyClass.x) print(MyClass.foo) print(MyClass.__doc__) print(type(MyClass))
foo是method方法對象,不是普通的函數對象function了(函數function不在類里面),它必須至少有一個參數,且第一個參數必須是self(self可以換名字),但這個參數位置就留給了self。 java是使用this.
self指代當前實例本身;
__init__方法
MyClass()實際上調用的是__init__(self)方法,可以不定義,如果沒有定義會在實例后隱式調用。
作用:對實例進行初始化。
__init__()方法不能有返回值,也就是只能是None.
實例可以訪問類屬性,類不可以訪問實例屬性。方法中可以通過self.y等來定義實例屬性。
初始化函數可以多參
實例對象instance
類實例化后一定會獲得一個對象,就是實例對象。
__init__方法的第一個參數self就是指代某一個實例。
實例變量,類變量
實例變量是每一個實例自己的變量,是自己獨有的;類變量是類的變量,是類的所有實例共享的屬性和方法。
特殊屬性:含義
__name__:對象名
__class__:對象的類型
__dict__:對象的屬性的字典
__qualname__:類的限定名
總結
是類的,也是這個類所有實例的,其實例都可以訪問到;是實例的,就是這個實例自己的,通過類訪問不到。
類變量是屬於類的變量,這個類的所有實例可以共享這個變量。
實例可以動態的給自己增加一個屬性。實例.__dict__[變量名]和實例.變量名都可以訪問到。
實例的同名變量會隱藏這類變量,或者說是覆蓋了這個類變量。
實例屬性的查找順序
指的是實例使用.來訪問屬性,會先找自己的__dict__,如果沒有,然后通過屬性__class__找到自己的類,再去類的__dict__中找。
注意,如果實例使用__dict__[變量名]訪問變量,將不會按照上面的查找順序找變量了。
一般來說,類變量使用全大寫來命名。
class Person: age=3 height=170 def __init__(self,name,age=18): self.name=name self.age=age hua=Person('hua') Tony=Person("Tony",20) Person.age=30 print(Person.age,hua.age,Tony.age)#30,18,20 print(Person.__dict__,hua.__dict__,Tony.__dict__,sep="\n") print(Person.height,hua.height,Tony.height)#170,170,170 Person.height+=20 print(Person.height,hua.height,Tony.height)#190,190,190 print(Person.__dict__,hua.__dict__,Tony.__dict__,sep="\n") hua.height=20 print(Person.height,hua.height,Tony.height)#190,20,190 print(Person.__dict__,hua.__dict__,Tony.__dict__,sep="\n") print(Person.__dict__["height"]) print(Tony.__dict__["height"])#報錯keyerror #對象優先訪問自己的屬性/字典,自己沒有,則訪問類的屬性/字典