-
由于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)
查看全部
举报