重写,覆盖,复写父类中的方法
class A():
def __init__(self,name,age):
self.name=name
self.age=age
class B(A):
def __init__(self,name,age,sex):
self.sex=sex
super().__init__(name,age)
#a=A("李四",17)
#print(a.__age)
#b=B("张三",38)
b=B("张三",38,"男")
#print(b.name)
#print(b.__age)
钻石继承:
class A():
def f(self):
print("a")
class B(A):
def f(self):
super().f()
print("b")
class C(A):
def f(self):
super().f()
print("c")
class D(B,C):
def f(self):
super().f()
print("D")
d=D()
d.f()
多态的例子:
class Dog():
def jiao(self):
print("汪汪")
class Cat():
def jiao(self):
print("喵喵")
def honghong(a):
a.jiao()
c=Cat()
d=Dog()
honghong(c)
honghong(d)
魔术方法
#del
销毁魔术方法
触发时机: 当一个对象在内存中被销毁的时候执行
class A():
num=0 #类属性也叫静态属性
def __init__(self,name):
A.num+=1 # 每定义一个对象,我的计数器加1
self.name=name
def __del__(self):
A.num-=1
print(self.name,"被删除,还剩下{}个对象".format(A.num))
a=A("张三")
b=A("李四")
c=A("王五")
print(A.num)
del a
del b
del c
#3
#张三 被删除,还剩下2个对象
#李四 被删除,还剩下1个对象
#王五 被删除,还剩下0个对象
class A():
def __init__(self,num):
self.num=num
def __call__(self,n):
return self.num*n
a=A(7)
b=a(9) # 把对象当成函数用,让类的实例具有类似于函数的行为
print(b) # 63
class Fib():
def __init__(self):
pass
def __call__(self,month):
lst=[]
a,b=1,1
n=1
while n<=month:
lst.append(a)
a,b=b,a+b
n+=1
return lst
f=Fib()
for i in range(1,10):
print(f(i))
class Fib():
def __init__(self):
pass
def __call__(self,month):
lst=[]
a,b=1,1
n=1
while n<=month:
lst.append(a)
a,b=b,a+b
n+=1
return lst[len(lst)-1]
f=Fib()
for i in range(1,10):
print(f(i))
class Fib():
def __init__(self):
pass
def __call__(self, month):
lst = []
a, b = 0, 1
n = 1
while n <= month:
lst.append(a)
a, b = b, a + b
n += 1
return a
f = Fib()
for i in range(1, 10):
print(f(i))
class Per():
def __init__(self,name,age):
self.name=name
self.age=age
def __str__(self):
return "{},{}".format(self.name, self.age)
def __repr__(self): # 复写了父类的方法
return "我叫{},年龄{}".format(self.name,self.age)
a=Per("张三",28)
print(str(a)) # 我叫张三,年龄28 # 张三,28 # 有str优先执行str方法,没有str方法执行repr备胎
print(repr(a)) # 我叫张三,年龄28
class Per():
def __init__(self,name,age):
self.name=name
self.age=age
def __str__(self):
return "{},{}".format(self.name, self.age)
def __repr__(self): # 复写了父类的方法
return "我叫{},年龄{}".format(self.name,self.age)
a=Per("张三",28)
print(str(a))
print("我说: %r"%(a)) # 我说: 我叫张三,年龄28 # 找的是repr
print("我说: %s"%(a)) # 我说: 张三,28 # 找的是str
print(repr(a)) # 我叫张三,年龄28
class Stu():
# 实例化,实际上是创建一个新的对象
def __new__(cls, *args, **kwargs): # 生产汽车
print("111111")
return object.__new__(cls) # 用object类,去创建一个此类的对象实体cls,代表的是本类
def __init__(self,name,age): # 初始化的时候触发 # 对汽车进行修饰,
print("222222")
self.name=name
self.age=age
zs=Stu("张三",18)
print(zs.name)
a=[1,2,3]
b=[1,2,3]
print(a==b) # True
print(a is b) # False
print(id(a)) # 30237320
print(id(b)) # 30237384
class Stu():
def __init__(self,name,age):
self.name=name
self.age=age
def __eq__(self, other):
print("333333")
return self.__dict__==other.__dict__ # 比较字典内容相等
a=Stu("张三",19)
#print(a.__dict__) # {'name': '张三', 'age': 19}
b=Stu("张三",19)
c=Stu("李四",20)
print(a==b) # False # 没有def eq 那两行是全方位比较,False ;有的话就是比较字典里的内容,值相等
print(a==c) # False
print(a)
print(b)
print(a is b) # False # 内存地址不一样
d=[]
d.append(a)
if b not in d:
d.append(b)
print(d)
class Stu():
def __init__(self,name,age):
self.name=name
self.age=age
def __eq__(self, other):
print("self",self.__dict__) # self {'name': '张三', 'age': 19} # a
print("other",other.__dict__) # other {'name': '张三', 'age': 19} # b
b=self.__dict__==other.__dict__ # # 比较字典内容相等
return b
a=Stu("张三",19)
#print(a.__dict__) # {'name': '张三', 'age': 19}
b=Stu("张三",19)
print(a==b) # True
a=42 # 仅仅只针对于整数字符串,相等
print(id(a))
b=42
print(id(b))
a=[1,2,3]
b=[1,2,3]
print(id(a[0]))
print(id(b[0]))
a={'a','b',[1,2,3]}
print(a) # 集合要求里面数据类型可哈希,列表不行
class Stu():
def __init__(self,name):
self.name=name
a=Stu("张三")
b=Stu("李四")
c=Stu("王五")
#s={a,b,c}
#print(s)
print(hash(a))
print(id(a)/16)
class Stu():
def __init__(self,name):
self.name=name
def __eq__(self, other):
return self.name==other.name
def __hash__(self): # 删掉hash这两行报错,不可hash类型,
return hash(self.name)
a=Stu("张三")
b=Stu("李四")
c=Stu("张三")
#print(id(a)) # 35205864
#print(id(b)) # 35205752
#print(id(c)) # 35209000
print(hex(id(a))) # 0x1df32e8
print(hex(id(b))) # 0x1df3278
print(hex(id(c))) # 0x1df3f28
#print(a==b) # False
#print(a==c) # True
d={a,b,c} # set()通过hash 和 eq 来去重
print(d) # {<__main__.Stu object at 0x0000000001DF3278>, <__main__.Stu object at 0x0000000001DF32E8>}
class A():
pass
class B(A):
pass
print(issubclass(B,A)) # B是A的子类吗? True
class A():
pass
class C():
pass
a=A()
b=isinstance(a,A)
print(b) # True
b=isinstance(a,C)
print(b) # False
class A():
xiaogou=10
@staticmethod
def hehe(num):
print("我的数是",num)
delattr(A,'xiaogou') # 删除A里面xiaogou属性
b=hasattr(A,'xiaogou') # A里面有小狗这个属性
print(b) # True
c=getattr(A,"xiaogou") # A里面获取xiaogou的值
print(c) # 10
a=A()
print(A.__dict__)
f=getattr(A,"hehe") # 除了获取属性外还可以获取方法
f(9)
class A():
def f1(self):
print("我是f1")
def f2(self):
print("我是f2")
def f3(self):
print("我是f3")
print(A.__dict__)
a=A()
while True:
f=input("请输入你想要调用的方法:")
if hasattr(A,f):
fc=A.__dict__.get(f)
print("A类有:",f)
fc(a)
else:
print("A类没有:",f)
class A():
xiaogou=199
print(A.__dict__)
setattr(A,"zhutou",200)
print(A.__dict__)
a=A()
print(a.__dict__)
setattr(a,"haha",1999)
print(a.__dict__)
a.hehe=2022
import demo
x=getattr(demo,'d')
print(x)
f=getattr(demo,'func')
f("胡巴")
lei=getattr(demo,'A')
a=lei("张三")
print(a.name)
import sys
def haha():
print("hehehehe")
zhutou=299
print(sys.modules)
print(sys.modules['__main__']) # <module '__main__' from 'D:/python project/第三周/第二天/7月30号.py'> # 字典
x=getattr(sys.modules['__main__'],'zhutou')
print(x) # 299
x=getattr(sys.modules['__main__'],'haha')
x()
a=[1,2,3,4,5,6,7,8,9,10]
i=0 # 下标
count=0 # 数1,2,3
j=0 # 记0的个数
while True:
if a[i] != 0: # 只有未设置成0的数才参与报数
count+=1 # 报数
if count==3: # 如果报数为3,那么让其出局,设置为0
count=0
a[i]=0
j+=1
if j==9:
break
i=(i+1)%len(a) # 下标从0往后走,遇到10,重新变为0
print(a)
for i in range(6):
for j in range(6 - i):
print(" ", end=" ")
for k in range(2*i+1):
print("*",end=" ")
print()
for i in range(6):
for j in range(6 - i):
print(" ", end="")
for k in range(2*i+1):
if k==0 or k==2*i or i==5: # 第一个和最后一个打印*,第六行打印*号
print("*",end="")
else:
print(" ",end="")
print()