19.5.7笔记and作业

笔记
面向对象的三大特性,封装,继承,多态
封装

class A():
    __a=100
    def __init__(self,name,age):
        self.name=name
        self.__age=age
    def dayin(self):
        print(self.name,self.__age,A.__a)
zs=A('张三',19)
zs.dayin()###内部调用,可以使用
print(zs.__age)#不能调用,私有化封装

继承

class Shuiguo():
    def __init__(self,name,jiage):
        self.name=name
        self.jiage=jiage
    def dayin(self):
        print(self.name,self.jiage)
class Xigua(Shuiguo):
    def __init__(self,name,jiage,chandi,pingzhong):
        super().__init__(name,jiage)
        self.chandi=chandi
        self.pingzhong=pingzhong
    def showSelf(self):
        super().dayin()
        print(self.chandi,self.pingzhong)
xg=Xigua('西瓜',20,'新疆','甜瓜')
xg.showSelf()

多态

class Dog():
    def jiao(self):
        print('汪汪')
class Cat():
    def jiao(self):
        print('喵喵')
def jiao(x):
    x.jiao()
d=Dog()
c=Cat()
jiao(d)
jiao(c)

重载,override

class A():
    def func(self):
        print('哈哈')
class B(A):
    def func(self):##子类与父类拥有同名函数,子类函数将主函数覆盖
        super().func()
        print('嘿嘿')
zs=B()
zs.func()

魔术方法
__del__方法

class A():
    count=0
    def __init__(self,name):
        self.name=name
        A.count+=1
    def __del__(self):
        A.count-=1
        print('删除了',self.name,'还剩',self.count)
zs=A('张三')
ls=A('李四')
del zs
del ls

__call__方法

class A():
    count=0
    def __init__(self,name):
        self.name=name
        A.count+=1
    def __call__(self,x):
        print('我被调用了',x)
zs=A('张三')
zs.__call__(1)

class Feibo():

    def __init__(self):
        pass
    def __call__(self,n):
        a,b=1,1
        lb=[]
        if n==1:
            lb.append(1)
        elif n==2:
            lb.append(1)
            lb.append(1)
        else:
            x=1
            while x<=n:
                lb.append(a)
                a,b=b,a+b
                x+=1
            return lb
a=Feibo()
print(a(5))

__repr__方法

class Stu():
        def __init__(self,name,age):
            self.name=name
            self.age=age
        def __str__(self):
            return 'str我叫{},今年{}'.format(self.name,self.age)
        def __repr__(self):
            return 'repr姓名{},年龄{}'.format(self.name,self.age)
    zs=Stu('张三',19)
    x='%s'%(zs)##调用str
    y='%r'%(zs)##调用repr,当str没有的时候,默认调用repr,相当于是str的备胎
    print(x)
    print(y)

hastter(对象,‘属性’),判断对象调用的类中,是否含有这个属性,返回True或者False

   class A():
        count=0
        def __init__(self,name):
            self.name=name
    zs=A('张三')

 print(hasattr(zs,'name'))#True
 print(hasattr(zs,'count'))#True
 print(hasattr(zs,'age'))#False
zs.age=18##添加了age这个属性
print(zs.age)
print(hasattr(zs,'age'))

eg2:

class Stu():
    count=0
    def __init__(self,name):
        self.name=name
if not hasattr(Stu,'tax'):
    print('没有')
    Stu.tax=100
print(Stu.tax)

__new__和__init__的区别,__new__是造车,__init__是装饰车

> class Stu():
>     def __new__(cls, *args, **kwargs):
>         print('我在new',cls)##cls是Stu类
>     def __init__(self,name):
>         print('我在init')
>         self.name=name 
zs=Stu('张三')

单例模式

class Stu():
    def __new__(cls, *args, **kwargs):
        if not hasattr(cls,'inst'):
            cls.inst=object.__new__(cls)#cls指的是Stu这个类,object是没有父类,默认是基类
        return cls.inst
    def __init__(self,name):
        self.name=name
a=Stu('张三')##返回相同的inst,第一个name返回的是张三
b=Stu('李四')##返回相同的inst,李四将原来的张三覆盖,name相当于在inst中修改
print(a==b)###True
print(a is b)##True
print(id(a))
print(id(b))
print(a.name)##李四
print(b.name)##李四

==和is的区别,is是指id相同,==只是指内容相同

a=[1,2,23]
b=[1,2,23]
print(a==b)##True
print(id(a))
print(id(b))
print(a is b)##False

#__equal__方法

class A():
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __eq__(self, other):
        if self.name==other.name and self.age==other.age:
            print('年龄和名字相等')
            return True
        else:
            return False
a=A('张三',19)
b=A('李四',20)
c=A('张三',19)
print(a==b)
print(a==c)##True
print(a is b)##False,只是年龄和名字相等

eg:

class A():
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def __eq__(self, other):
        print(self.__dict__)
        return self.__dict__==other.__dict__
a=A('张三',19)
b=A('李四',20)
c=A('张三',19)
lb=[]
if a not in lb:
    lb.append(a)
if b not in lb:
    lb.append(b)
if c not in lb:
    lb.append(c)
print(lb)

hash()函数

class Stu():
    def __init__(self,name,age):
        self.name=name
    def __eq__(self, other):
        return  self.__dict__==other.__dict__
    def __hash__(self):
        return hash(self.name)
a=Stu('张三',19)
b=Stu('李四',20)
c=Stu('张三',19)
d={a,b,c}
print(a)
print(b)
print(c)
print(d)

issubclass(子类,父类),判断函数是不是另一函数的子类,#isinstance判断c是不是A的实例

#gatattr方法的使用(获取对象,属性)

class Teacher():
    dic={'name':'hehe','age':19}
    def __init__(self,name,age):
        self.name=name
        self.age=age
    @classmethod
    def func1(cls):
        print('呵呵')
    def func2(self):
        print('嘎嘎')
a=Teacher('张三',10)
d=getattr(Teacher,'dic')#获取dic,获取类属性的时候,(填类,‘属性’)
print(d)
e=getattr(a,'name')##获取张三,获取非类属性(a,'属性')
print(e)
f=getattr(a,'func1')##获取呵呵
f()
g=getattr(a,'func2')##获取嘎嘎
g()

#setattr()方法

class A():
    pass
setattr(A,'count',100)
print(A.count)
a=A()
setattr(a,'count',200)
print(a.count)

delattr的用法,delatter(删除对象,‘删除对象的属性’)

class Teacher():
    Tax=100
    def __init__(self,name,age):
        self.name=name
        self.age=age
a=Teacher('张三',19)
delattr(Teacher,'Tax')#删除Teacher的Tax
delattr(a,'name')##删除a的name
print(a.age)
b=Teacher('李四',19)
print(b.name)

作业
1.魔术方法 eq 方法练习

class Myint(int):
    def __eq__(self, other):
        if self%6==0 and self%2==0:
            return True
        else:
            return False
no1=Myint(6)
no2=Myint(12)
result=no1==no2
print(result)
  1. 魔术方法 hash 和 __eq__练习
    设计二维坐标类Point,比较2个坐标是否相等?
class Point(object):
    def __init__(self,x,y):
        self.x=x
        self.y=y
    def __hash__(self):
        return hash(self.x)
    def __eq__(self, other):
        return self.x==other.x and self.y==other.y
p1=Point(1,2)
p2=Point(1,2)
print(hash(p1))
print(hash(p2))
print(p1 is p2)
print(p1==p2)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值