封装
self参数
继承 子类后面加()
class A:
x=520
def hello(self):
print("你好,我是A")
class B(A):
pass
b=B()
b.x
520
b.hello ()
你好,我是A
覆盖
class B(A): x=880 def hello(self): print("你好,我是B~") b=B() b.x 880 b.hello() 你好,我是B~
issubclass() 检测一个类是否为某个类的子类
issubclass(A,B) False
多重继承 (访问顺序,从左到右)
class C( A,B)
组合
class Turtle:
def say(self):
print("朋友来了,有酒")
class Cat:
def say(self):
print("七喜就会喵喵喵~")
class Dog:
def say(self):
print("哦呼,我是鹿卡,是一只修勾勾~~")
class Garden:
t=Turtle()
c=Cat()
d=Dog()
def say(self):
self.t.say()
self.c.say()
self.d.say()
g=Garden()
g.say()
朋友来了,有酒
七喜就会喵喵喵~
哦呼,我是鹿卡,是一只修勾勾~~
2.构造函数 __init__( ) 方法
class C:
def __init__(self,x,y)
SyntaxError: expected ':'
class C:
def __init__(self,x,y):
self.x=x
self.y=y
def add(self):
return self.x+self.y
def mul(self):
return self.x*self.y
c=C(2,3)
c.add()
5
c.mul()
6
c.__dict__
{'x': 2, 'y': 3}
d=C(4,5)
d.__dict__
{'x': 4, 'y': 5}
d.add()
9
3.重写
未绑定父类
class D(C):
def __init__(self,x,y,z):
C.__init__(self,x,y)
self.z=z
def add(self):
return C.add(self)+self.z
def mul(self):
return C.mul(self)*self.z
d=D(2,3,4)
d.add()
9
d.mul ()
24
3.多态
class Shape: 定义一个形状类
def __init__(self,name): 构造函数
self.name=name 名字
def area(self): 面积
pass
class Square(Shape): 定义一个正方形类,继承shape类
def __init__(self,length):
super().__init__("正方形")
self.length=length
def area(self):
return self.length * self.length
class Circle(Shape): 定义一个圆形类,继承shape类
def __init__(self,r):
super().__init__("圆形")
self.r=r
def area(self):
return 3.14 * self.r * self.r
class Triangle(Shape): 定义一个三角形类,继承shape类
def __init__(self,base,height):
super().__init__("三角形")
self.base=base
self.height=height
def area(self):
return self.base * self.height / 2
s=Square(5)
c=Circle(2)
t=Triangle(3,4)
s.name
'正方形'
c.name
'圆形'
t.name
'三角形'
s.area ()
25
c.area ()
12.56
t.area ()
6.0
class Cat:
def __init__(self,name,age):
self.name=name
self.age=age
def intro(self):
print(f"我是一只沙雕猫咪,我叫{self.name},今年{self.age}大了~~~")
def say(self):
print("mau~~")
class Dog:
def __init__(self,name,age):
self.name=name
self.age=age
def intro(self):
print(f"我是一只小狗狗,我叫{self.name},今年{self.age}岁~~~")
def say(self):
print("哦吼~~")
class Pig:
def __init__(self,name,age):
self.name=name
self.age=age
def intro(self):
print(f"我是一只小猪猪,我叫{self.name},今年{self.age}岁~~~")
def say(self):
print("oink~~")
c=Cat("七喜","三个月")
d=Dog("鹿卡","5")
p=Pig("大肠",3)
def animal(x):
x.intro()
x.say()
animal(c)
我是一只沙雕猫咪,我叫七喜,今年三个月大了~~~
mau~~
animal(d)
我是一只小狗狗,我叫鹿卡,今年5岁~~~
哦吼~~
animal(p)
我是一只小猪猪,我叫大肠,今年3岁~~~
oink~~
4.鸭子类型
5.私有变量 __x
class C:
def __init__(self,x):
self.__x=x
def set_x(self,x): 设置变量
self.__x=x
def get_x(self): 获取变量
print(self.__x)
c=C(250)
c.__x
Traceback (most recent call last):
File "", line 1, in
c.__x
AttributeError: 'C' object has no attribute '__x'
c.get_x()
250
c.set_x (520) 修改为520
c.get_x () 访问
520
__slots__ 的限制作用
class C:
__slots__=["x","y"] 只有两个参数
def __init__(self,x):
self.x=x
c=C(250)
c.x
250
c.y=520
c.y
520
c.z=666
Traceback (most recent call last):
File "", line 1, in
c.z=666
AttributeError: 'C' object has no attribute 'z'
继承自父类的__slots__属性是不会在子类中生效的,
6. __new__(cls[,......])class CapStr(str):
def __new__(cls,string): 字符串类
string=string.upper() 变为大写
return super().__new__(cls,string)
cs=CapStr("Python")
cs
'PYTHON'
cs.lower()
'python'
cs.capitalize ()
'Python'
__del__(cls[,......]) 销毁方法
class C:
def __init__(self):
print("我来了~~")
def __del__(self):
print("我走了~~")
c=C()
我来了~~
del c
我走了~~
c=C()
我来了~~
d=c
del c 没用了
del d
我走了~~
重生:使用闭包的方法
7.运算方法(各种方法类似)
相加:(要求不是拼接)
class S(str):
def __add__(self,other):
return len(self)+len(other)
s1=S("english")
s2=S("python")
s1+s2
13
8.
二进制 bin( )
bin(2) '0b10' bin(8) '0b1000' 3|2 按位或 3 3|4 7 3&4 按位与 0 2&3 2 ~3 按位取反 -4 ~2 -3 3^2 按位异或 1 3^4 7
左移<< (n位就是乘以2的n次方) 右移>> (右移n位就是地板除以2的n次方)
bin(8) '0b1000' 8>>2 右移2位 2 8>>3 1 8<<2 左移2位 32 8<<3 64
9.属性访问
hasattr() 检测对象是否有某个属性
getattr() 获取对象中的某个属性值
与之对应的函数(getattribute)
class C:
def __init__(self,name,age):
self.name=name
self.__age=age
def __getattribute__(self,attrname):
print("拿来吧你~~")
return super().__getattribute__(attrname)
c=C("猪大肠",18)
getattr(c,"name")
拿来吧你~~
'猪大肠'
拿来吧你~~
拿来吧你~~
c.__C__age
拿来吧你~~
setattr() 设置某个属性的属性值
delattr() 删除某个属性
对应的函数:
class D:
def __setattr__(self,name,value):
self.__dict__[name]=value 使用字典
def __delattr__(self,name):
del self.__dict__[name]
d=D()
d.name="猪大肠"
d.__dict__
{'name': '猪大肠'}
del d.name
d.__dict__
{}
总体的访问:
class C:
def __init__(self,name,age):
self.name=name
self.__age=age 设为私有属性
c=C("猪大肠",18)
hasattr(c,"name")
True
getattr(c,"name") 访问属性
'猪大肠'
getattr(c,"_C__age") 访问私有属性
18
setattr(c,"_C__age",28) 设置属性变量
getattr(c,"_C__age")
28
delattr(c,"_C__age") 删除
hasattr(c,"_c__age")
False
10.迭代器创建
class Double:
def __init__(self,start,stop):
self.value=start-1
self.stop=stop
def __iter__(self):
return self
def __next__(self):
if self.value==self.stop:
raise StopIteration
self.value+=1
return self.value*2
d=Double(1,5)
for i in d:
print(i,end='')
246810



