Python学习9

# 类和实例的方法修改

# 重写类的方法, 定义新函数,将类的旧方法用新函数代替,

class Myclass():

    def func(self):
        print("你要加油")

My_class = Myclass()
# My_class.func()

# 定义一个新函数
def func2(self):
    print("自己要相信自己,你要加油")

# 修改类方法
# 类的旧方法用新函数代替,【重写类的方法】
Myclass.func= func2
My_class.func()

结果

自己要相信自己,你要加油

修改实例方法,类方法报错,(无self参数依然报错)

# 修改实例方法,类方法会直接报错
My_class.func = func2
My_class.func()
Traceback (most recent call last):
  File "D:/Py_code/Py_based/day7/6th.py", line 20, in <module>
    My_class.func()
TypeError: func2() missing 1 required positional argument: 'self'

初始化函数和析构函数

class class_name1():
    def __init__(self):
        print("这是初始化函数, 实例化时自动调用")
    def __del__(self):
        print("这是析构函数,在删除实例时自动调用")

cls1 = class_name1()
del cls1

结果

这是初始化函数, 实例化时自动调用
这是析构函数,在删除实例时自动调用

继承

# 继承
# 继承父类的属性和方法 or  覆盖父类属性和方法

class Animal():

    def __init__(self, type):
        self.type = type

    def get_name(self):
         print("输入的动物种类是 :{}".format(self.type))

# 继承 
class Dog(Animal):
    pass 


if __name__ == "__main__":
    DDog = Dog("狗")
    DDog.get_name()

重写父类方法,父类方法的调用

# 重写父类方法
class Bird:
    def isWing(self):
        print("鸟有翅膀")
    def fly(self):
        print("鸟会飞")

class ostrich(Bird):
    def fly(self):
        print("鸵鸟不会飞")

ostrich = ostrich()
ostrich.isWing()

# 父类重写方法调用, 类.方法
Bird.fly(ostrich)

父类方法调用的时候,使用类.方法的形式,python不会默认为self赋值,要指定。

多态

# 多态
# 是指对不同类型的变量进行相同的操作,它会根据对象(或类)类型的不同而表现出不同的行为
class User():
    def __init__(self, name):
        self.name = name

    def printuser(self):
        print("hello, {}".format(self.name))

class Vipuser(User):
    def printuser(self):
        print("hello, 尊敬的vip用户:{}".format(self.name))

class Generaluser(User):
    def printuser(self):
        print("hello, 尊敬的用户:{}".format(self.name))


def printinfo(user):
    user.printuser()

if __name__ == "__main__":
    vipuser = Vipuser("AD")
    printinfo(vipuser)
    generaluser = Generaluser("tt")
    printinfo(generaluser)
    user = User("xx")
    printinfo(user)

不同类型的用户在调用printinfo函数时,自动调用各自类型的printuser方法

hello, 尊敬的vip用户:AD
hello, 尊敬的用户:tt
hello, xx

# 类的访问控制

# 类的访问控制
# 使用 __private_attrs 两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问
class User():
    def __init__(self, name, age, count):
        self.name = name
        self.age = age
        self.__count = count

    def get_cout(self):
        print(self.__count())

if __name__ == "__main__":
    user = User("dw", 23, 31123131)
    print(dir(user))     # dir 打印属性
    print(user.__dict__) # __dict__ 打印构造函数中的属性
    print(user._User__count)
['_User__count', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'age', 'get_cout', 'name']
{'name': 'dw', 'age': 23, '_User__count': 31123131}
31123131

定义时该属性仅仅了count, 但是使用了__,打印属性时为_User__count 

类的专有方法

一个类创建的时候,就会包含一些方法,主要有以下方法:

类的专有方法:

方法说明
__init__构造函数,在生成对象时调用
__del__析构函数,释放对象时使用
__repr__打印,转换
__setitem__按照索引赋值
__getitem__按照索引获取值
__len__获得长度
__cmp__比较运算
__call__函数调用
__add__加运算
__sub__减运算
__mul__乘运算
__div__除运算
__mod__求余运算
__pow__乘方

当然有些时候需要获取类的相关信息,可以使用如下的方法:

  • type(obj):来获取对象的相应类型;
  • isinstance(obj, type):判断对象是否为指定的 type 类型的实例;
  • hasattr(obj, attr):判断对象是否具有指定属性/方法;
  • getattr(obj, attr[, default]) 获取属性/方法的值, 要是没有对应的属性则返回 default 值(前提是设置了 default),否则会抛出 AttributeError 异常;
  • setattr(obj, attr, value):设定该属性/方法的值,类似于 obj.attr=value;
  • dir(obj):可以获取相应对象的所有属性和方法名的列表:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值