-
由于Python是動態語言,任何實例在運行期都可以動態地添加屬性。
如果要限制添加的屬性,就可以利用Python的一個特殊的__slots__來實現。
查看全部 -
__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??新分子 = (當前分子 * 另一個分母) + (當前分母 * 另一個分子)
(3)self.q * r.q分母乘分母
(4)將新分子分母替換原來的p,q
????2.地板除的特殊方法是__floordiv__,普通除法是__truediv__。地板除法和普通除法不一樣,地板除法的結果只會向下取整數。
????3.在運算中,普通除法使用/表示,而地板除使用//表示。
查看全部 -
對于列表List或者元組Tuple,通過內建方法len(),可以得出列表或者元組中元素的個數。
如果一個類表現得像一個list,想使用len()函數來獲取元素個數時,則需要實現__len__()方法。
查看全部 -
對于Python的內建對象,比如int、dict、list等,通過str()方法,可以把這些對象轉換為字符串對象輸出。
#########################################################
class Person:
? ?pass
bob = Person()
str(bob) # ==> '<__main__.Person object at 0x7fc77b859c50>'#########################################################
(1)<__main__.Person object at 0x7fc77b859c50>這個結果其實是Animal的實例cat在內存中的地址
?????2.如果我們的類也想把容易理解的字符串輸出的話,那么我們也需要實現類的????????????__str__()方法。
?????3.當我們直接打印實例化對象的時候,調用的是__str__方法(用戶)的返回? ? ????????結果,當我們在終端中調用實例化對象的時候,得到確實__repr__?方?法????????(開發者)的返回結果。
查看全部 -
通過type()函數,可以獲得變量的類型。
通過dir()方法,可以獲取變量的所有屬性。
在dir列出的屬性中,有很多是以下劃線開頭和結尾的,這些都是特殊的方法,稱為內建方法。
########################################################
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)########################################################
對于實例變量,dir()返回所有實例屬性,包括__class__這類有特殊意義的屬性。注意到方法who也是p的一個屬性。
????4.dir()返回的屬性是字符串列表,如果已知一個屬性名稱,要獲取或者設置對象? ????????的屬性,就需要用 getattr() 和 setattr( )函數了。
????(1)getattr() :獲取某一對象屬性
????(2)?setattr( ):設置新的屬性
查看全部 -
在定義繼承類的時候,有幾點是需要注意的:
1.class Student()定義的時候,需要在括號內寫明繼承的類Person
2.在__init__()方法,需要調用super(Student, self).__init__(name, gender),來初始化從父類繼承過來的屬性
查看全部 -
如果需要操作類的私有屬性,則應該定義類的方法。
默認的,在class中定義的全部是實例方法。
和實例方法不同的是,這里有兩點需要特別注意:
(1)類方法需要使用@classmethod來標記為類方法,否則定義的還是實例方法
(2)類方法的第一個參數將傳入類本身,通常將參數名命名為 cls,上面的 cls.__localtion 實際上相當于Animal.__localtion。
查看全部 -
私有屬性是以雙下劃線'__'開頭的屬性。
私有屬性是為了保護類或實例屬性不被外部污染而設計的。
查看全部 -
在類屬性和實例屬性同時存在的情況下,實例屬性的優先級是要高于類屬性的
查看全部 -
# 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()))
查看全部 -
和實例方法不同的是,這里有兩點需要特別注意:
? ? 1.類方法需要使用@classmethod來標記為類方法,否則定義的還是實例方法
? ? 2.類方法的第一個參數將傳入類本身,通常將參數名命名為 cls,上面的? ? ? ? ? ? ? ? ? ? ?cls.__localtion 實際上相當于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)
查看全部
舉報