定義一個學生類,用來形容學生html
# 定義一個空的類 class Student(): # 一個空類,pass表明直接跳過 # 此處pass必須有 pass # 定義一個對象 mingyue = Student() #在定義一個類,用來描述聽Python的學生 class PythonStudent(): # 用None給不肯定的值賦值 name = None age = 18 course = "Python" # 須要注意 # 1.def doHomework的縮進層級 # 2.系統默認由一個self參數 def doHomework(self): print("I 在作做業") # 推薦在函數末尾使用return語句 return None # 實例化一個叫yueyue的學生,是一個具體的人 yueyue = PythonStudent() print(yueyue.name) print(yueyue.age) # 注意成員函數的調用沒有傳遞進入參數 yueyue.doHomework()
- 案例 02.py
class A(): name = 'jjc' age = 18 for k,v in A.__dict__.items(): print(k,"--",v)
實例化類python
變量 = 類名() # 實例化了一個對象
obj.成員屬性名稱 obj.成員方法
dict先後各有兩個下劃線 obj.__dict__
class_name.__dict__
- anaconda主要是一個虛擬環境管理器 - 仍是一個安裝包管理器 - conda list:顯示anaconda安裝的包 - conda env list:顯示anconda的虛擬環境列表 - conda create -n xxx python=3.6:建立python版本爲3.6的虛擬環境,名稱爲xxx
class Person(): # name是共有的成員 name = 'jjc' # __age就是私有成員 __age = 18 p = Person() print(p._Person__age)
# 繼承的語法 # 在python中,任何類都有一個共同的父類叫object class Person(): name = 'NoName' age = 0 def sleep(self): print('Sleeping') # 父類寫在括號內 class Teacher(Person): pass t = Teacher() t.sleep() print(t.name)
# 繼承的語法 # 在python中,任何類都有一個共同的父類叫object # 子類和父類定義同一個名稱變量,則優先使用子類自己 class Person(): name = 'NoName' age = 18 __score = 0 # 考試成績是祕密,只有本身知道 _petname = "sec" # 小名,保護的,子類能夠用,但不公用 def sleep(self): print('Sleeping') def work(self): print('make some money') # 父類寫在括號內 class Teacher(Person): teacher_id = '9527' name = 'jjc' def make_test(self): print('attention') def work(self): # 擴充父類的功能只須要調用父類相應的函數 # Person.work(self) # 另外一種方法,super表明父類 Person.work(self) super().work() self.make_test() t = Teacher() t.work()
# 構造函數的概念 # 繼承中的構造函數 class Animal(): def __init__(self): print('Dong wu') class PaxingAni(Animal): def __init__(self,name): print('Paxing Dongwu {0}'.format(name)) class Dog(PaxingAni): # __init__就是構造函數 # 每次實例化的時候,第一個被調用 # 由於主要工做是進行初始化,因此得名 def __init__(self): print("I'm init in dog") # 實例化的時候,括號內的參數須要跟構造函數參數匹配 # 由於找到了構造函數,則再也不查找父類的構造函數 kaka = Dog() # 實例化Dog時,查找到Dog的構造函數,參數匹配,不報錯 # 貓沒有寫構造函數 class Cat(PaxingAni): pass # 此時Cat沒有構造函數,則向上查找 # 由於PaxingAni的構造函數須要兩個參數,實例化的時候給了一個,報錯 c = Cat('jjc')
# 菱形繼承 class A(): pass class B(A): pass class C(A): pass class D(B,C): pass
[多態及多態性[(https://www.cnblogs.com/luchuangao/p/6739557.html)算法
class A(): name = 'Jjc' class B(A): pass class C(): pass #檢測B是否爲A的子類 print(issubclass(B,A)) print(issubclass(B,object)) # 返回True a=A() print(isinstance(a,A)) print(hasattr(a,'name'))
# 屬性案例 # 建立Student類,描述學生類 # 學生具備Student.name屬性 # 但 named格式不統一 class Student(): def __init__(self,name,age): self.name = name self.age = age #self.setName(name) def intro(self): print('Hi, my name is {0}'.format(self.name.upper())) def setName(self,name): self.name = name.title() s1 = Student('jJC',19) s2 = Student('wcx',18.0) s1.intro() s2.intro()
# property案例 class A(): def __init__(self): self._name = 'haha' self._age = 18 # 此功能,是對類變量進行讀取操做的時候應該執行的函數功能 def fget(self): print("{0}被讀取了".format(self._name)) return self._name # 模擬的是對變量進行寫操做的時候執行的功能 def fset(self, val): print("{0}我被寫入了,可是還能夠作好多事情".format(val)) self._name = '我是' + val # fdel模擬的是刪除變量的時候進行的操做 def fdel(self): del self._name name = property(fget, fset, fdel, "這是一個property的例子") a = A() a.name = "jjc" print(a.name)
#上面的代碼等價於下面的代碼 class A(object): @property def name(self): print("{0}被讀取了".format(self._name)) return self._name @name.setter def name(self,val): print("{0}我被寫入了,可是還能夠作好多事情".format(val)) self._name = '我是' + val @name.deleter def name(self): del self._name a = A() a.name = "jjc" print(a.name)
- __dict__:以字典的方式顯示類的成員組成 - __doc__:獲取類的文檔信息 - __name__:獲取類的名稱,若是在模塊中使用,獲取模塊的名稱 - __bases__:獲取某個類的全部父類,以元組的方式顯示
# __init__ 舉例 class A(): def __init__(self,name = 0): print("sa") # __call__舉例 def __call__(self): print("我被舉報了") def __str__(self): return 'bu' a = A() a() print(a)
class A(): def __getattr__(self,name): print('沒找到') print(name) a = A() print(a.name) print(a.addr)
# __setattr__案例 class Person(): def __init__(self): pass def __setattr__(self, name, value): print('設置屬性:{0}'.format(name)) # 下面語句會致使問題,死循環 #self.name = value # 此種狀況,爲了不死循環,規定統一調用父類魔法函數 super().__setattr__(name,value) p = Person() print(p.__dict__) p.age = 18
# __get__ class Student(): def __init__(self,name): self._name = name def __gt__(self,obj): print("haha, {0}會比{1}大嗎?".format(self._name,obj._name)) return self._name > obj._name # 字符串的比較是按什麼規則 stu1 = Student('one') stu2 = Student('two') print(stu1 > stu2) # 問,如何讓顯示結果美觀,one 會比 twi大嗎
# 三種方法案例 class Person: # 實例方法 def eat(self): print(self) print('Eating……') # 類方法 # 類方法的第一個參數,通常命名爲cls,區別於self @classmethod def play(cls): print(cls) print('Playing……') # 靜態方法 # 不須要用第一個參數表示自身或者類 @staticmethod def say(): print('Saying……') yueyue = Person() #實例方法 yueyue.eat() # 類方法 Person.play() yueyue.play() # 靜態方法 Person.say() yueyue.say()
# 抽象類的實現 import abc # 申明一個類而且制定當前類的元類 class Human(metaclass = abc.ABCMeta): # 定義一個抽象的方法 @abc.abstractmethod def smoking(self): pass # 定義類抽象方法 @abc.abctractclassmethod def drink(): pass # 定義靜態抽象方法 @abc.abstractstaticmethod def play(): pass
# 本身組裝一個類 # 若是要綁定對象,用下面一句代碼,綁定類,不須要 from types import MethodType class A(): pass def say(self): print("saying……") a = A() a.tt = MethodType(say,A) a.tt()
# 利用type造一個類 # 先定義類應該具備的成員函數 def say(self): print("saying……") def talk(self): print("Talking……") # 用type來建立一個類 A = type("AName",(object,),{"class_say":say, "class_talk":talk}) # 而後能夠像正常訪問同樣使用類 a = A() a.class_say() a.class_talk()
# 元類演示 # 元類寫法是固定的,必須繼承自type # 元類通常命名以MetaClass結尾 class TulingMetaClass(type): # 注意一下寫法 def __new__(cls, name, bases, attrs): # 本身的業務處理 print("我是元類") attrs['id'] = '000000' attrs['addr'] = "蘇州市" return type.__new__(cls, name, bases, attrs) # 元類定義完就可使用,使用注意寫法 class Teacher(object, metaclass = TulingMetaClass): pass t = Teacher() t.id