-
由于Python是動(dòng)態(tài)語(yǔ)言,任何實(shí)例在運(yùn)行期都可以動(dòng)態(tài)地添加屬性。
如果要限制添加的屬性,就可以利用Python的一個(gè)特殊的__slots__來(lái)實(shí)現(xiàn)。
查看全部 -
__add__、__sub__、__mul__、__truediv__? ?加減乘除
class Rational(object):
? ?def __init__(self, p, q):
? ? ? ?self.p = p
? ? ? ?self.q = q
? ?def __add__(self, r):
? ? ? ?return Rational(self.p * r.q + self.q * r.p, self.q * r.q)
? ?def __str__(self):
? ? ? ?return '{}/{}'.format(self.p, self.q)(1)p分子,q分母
(2)self.p * r.q + self.q * r.p??新分子 = (當(dāng)前分子 * 另一個(gè)分母) + (當(dāng)前分母 * 另一個(gè)分子)
(3)self.q * r.q分母乘分母
(4)將新分子分母替換原來(lái)的p,q
????2.地板除的特殊方法是__floordiv__,普通除法是__truediv__。地板除法和普通除法不一樣,地板除法的結(jié)果只會(huì)向下取整數(shù)。
????3.在運(yùn)算中,普通除法使用/表示,而地板除使用//表示。
查看全部 -
對(duì)于列表List或者元組Tuple,通過(guò)內(nèi)建方法len(),可以得出列表或者元組中元素的個(gè)數(shù)。
如果一個(gè)類表現(xiàn)得像一個(gè)list,想使用len()函數(shù)來(lái)獲取元素個(gè)數(shù)時(shí),則需要實(shí)現(xiàn)__len__()方法。
查看全部 -
對(duì)于Python的內(nèi)建對(duì)象,比如int、dict、list等,通過(guò)str()方法,可以把這些對(duì)象轉(zhuǎn)換為字符串對(duì)象輸出。
#########################################################
class Person:
? ?pass
bob = Person()
str(bob) # ==> '<__main__.Person object at 0x7fc77b859c50>'#########################################################
(1)<__main__.Person object at 0x7fc77b859c50>這個(gè)結(jié)果其實(shí)是Animal的實(shí)例cat在內(nèi)存中的地址
?????2.如果我們的類也想把容易理解的字符串輸出的話,那么我們也需要實(shí)現(xiàn)類的????????????__str__()方法。
?????3.當(dāng)我們直接打印實(shí)例化對(duì)象的時(shí)候,調(diào)用的是__str__方法(用戶)的返回? ? ????????結(jié)果,當(dāng)我們?cè)?strong>終端中調(diào)用實(shí)例化對(duì)象的時(shí)候,得到確實(shí)__repr__?方?法????????(開發(fā)者)的返回結(jié)果。
查看全部 -
通過(guò)type()函數(shù),可以獲得變量的類型。
通過(guò)dir()方法,可以獲取變量的所有屬性。
在dir列出的屬性中,有很多是以下劃線開頭和結(jié)尾的,這些都是特殊的方法,稱為內(nèi)建方法。
########################################################
class Person(object):
? ?def __init__(self, name, gender):
? ? ? ?self.name = name
? ? ? ?self.gender = gender
? ?def who(self):
? ? ? ?return 'I am a Person, my name is {}'.format(self.name)
p = Person('Alice', 'Female')
dir(p)########################################################
對(duì)于實(shí)例變量,dir()返回所有實(shí)例屬性,包括__class__這類有特殊意義的屬性。注意到方法who也是p的一個(gè)屬性。
????4.dir()返回的屬性是字符串列表,如果已知一個(gè)屬性名稱,要獲取或者設(shè)置對(duì)象? ????????的屬性,就需要用 getattr() 和 setattr( )函數(shù)了。
????(1)getattr() :獲取某一對(duì)象屬性
????(2)?setattr( ):設(shè)置新的屬性
查看全部 -
在定義繼承類的時(shí)候,有幾點(diǎn)是需要注意的:
1.class Student()定義的時(shí)候,需要在括號(hào)內(nèi)寫明繼承的類Person
2.在__init__()方法,需要調(diào)用super(Student, self).__init__(name, gender),來(lái)初始化從父類繼承過(guò)來(lái)的屬性
查看全部 -
如果需要操作類的私有屬性,則應(yīng)該定義類的方法。
默認(rèn)的,在class中定義的全部是實(shí)例方法。
和實(shí)例方法不同的是,這里有兩點(diǎn)需要特別注意:
(1)類方法需要使用@classmethod來(lái)標(biāo)記為類方法,否則定義的還是實(shí)例方法
(2)類方法的第一個(gè)參數(shù)將傳入類本身,通常將參數(shù)名命名為 cls,上面的 cls.__localtion 實(shí)際上相當(dāng)于Animal.__localtion。
查看全部 -
私有屬性是以雙下劃線'__'開頭的屬性。
私有屬性是為了保護(hù)類或?qū)嵗龑傩圆槐煌獠课廴径O(shè)計(jì)的。
查看全部 -
在類屬性和實(shí)例屬性同時(shí)存在的情況下,實(shí)例屬性的優(yōu)先級(jí)是要高于類屬性的
查看全部 -
# Enter a code
class Person(object):
? ?pass
class Student(Person):
? ? def __init__(self, name, age):
? ? ? ? self.name = name
? ? ? ? self.age = age
class Teacher(Person):
? ? def __init__(self, name, age):
? ? ? ? self.name = name
? ? ? ? self.age = age
class SkillMixin(object):
? ? pass
? ??
class BasketballMixin(SkillMixin):
? ? def skill(self):
? ? ? ? return 'basketball'
? ? ? ??
class FootballMixin(SkillMixin):
? ? def skill(self):
? ? ? ? return 'football'
? ? ? ??
class Basketball_Student(Student,BasketballMixin):
? ? def __init__(self,name,age):
? ? ? ? super(Basketball_Student,self).__init__(name,age)
class Football_Teacher(Teacher,FootballMixin):
? ? def __init__(self,name,age):
? ? ? ? super(Football_Teacher,self).__init__(name,age)
s = Basketball_Student('eric',24)
? ? ? ??
print('I am {},I like playing {}'.format(s.name,s.skill()))
查看全部 -
和實(shí)例方法不同的是,這里有兩點(diǎn)需要特別注意:
? ? 1.類方法需要使用@classmethod來(lái)標(biāo)記為類方法,否則定義的還是實(shí)例方法
? ? 2.類方法的第一個(gè)參數(shù)將傳入類本身,通常將參數(shù)名命名為 cls,上面的? ? ? ? ? ? ? ? ? ? ?cls.__localtion 實(shí)際上相當(dāng)于Animal.__localtion。
查看全部 -
class Fib(object):
? ? def __init__(self):
? ? ? ? self.array = []
? ? ? ?
? ? def __call__(self, num):
? ? ? ? if(num == 1):
? ? ? ? ? ? self.array = [1]
? ? ? ? elif(num == 2):
? ? ? ? ? ? self.array = [1, 1]
? ? ? ? else:
? ? ? ? ? ? self.array = [1, 1]
? ? ? ? ? ? for i in range(2, num):
? ? ? ? ? ? ? ? a = self.array[i - 1]
? ? ? ? ? ? ? ? b = self.array[i - 2]
? ? ? ? ? ? ? ? self.array.append(a + b)
? ? ? ? return self.array[:num]
f = Fib()
print(f(10))
查看全部 -
class Rational(object):
? ? def __init__(self, p, q):
? ? ? ? self.p = p
? ? ? ? self.q = q
? ? def __add__(self, r):
? ? ? ? return Rational(self.p * r.q + self.q * r.p, self.q * r.q)
? ? def __str__(self):
? ? ? ? return '{}/{}'.format(self.p, self.q)
? ? def __sub__(self, r):
? ? ? ? return Rational(self.p * r.q - self.q * r.p, self.q * r.q)
? ? def __mul__(self, r):
? ? ? ? return Rational(self.p * r.p, self.q * r.q)
? ? def __truediv__(self, r):
? ? ? ? return Rational(self.p * r.q, self.q * r.p)
r1 = Rational(1, 2)
r2 = Rational(1, 5)
print(r1 + r2)
print(r1 - r2)
print(r1 * r2)
print(r1 / r2)
查看全部 -
class Fib(object):
? ? def __init__(self,n):
? ? ? ? self.n = n
? ? ? ? self.fib_list = [1,1]
? ? ? ? if n == 1:
? ? ? ? ? ? self.fib_list=[1]
? ? ? ? elif n == 2:
? ? ? ? ? ? self.fib_list=[1,1]
? ? ? ? else:
? ? ? ? ? ? for i in range(2, n):
? ? ? ? ? ? ? ? if(i == len(self.fib_list)):
? ? ? ? ? ? ? ? ? ? self.fib_list.append(self.fib_list[i - 1] + self.fib_list[i - 2])
? ? def __str__(self):
? ? ? ? return str(self.fib_list)
? ? def __len__(self):
? ? ? ? return len(self.fib_list)
? ?
print(Fib(10))
print(len(Fib(10)))
print(len(Fib(10)))
查看全部 -
class Person(object):
? ? def __init__(self, name, gender):
? ? ? ? self.name = name
? ? ? ? self.gender = gender
class Student(Person):
? ? def __init__(self, name, gender, score):
? ? ? ? super(Student,self).__init__(name, gender)
? ? ? ? self.score = score
? ? def __str__(self):
? ? ? ? return f'name:{self.name},gender:{self.gender},score:{self.score}'
? ? def __repr__(self):
? ? ? ? return self.__str__()
p = Person('Bob','Male')
s = Student('Bob','Male',88)
print(s)
查看全部
舉報(bào)