# 类和实例的方法修改
# 重写类的方法, 定义新函数,将类的旧方法用新函数代替,
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)
:可以获取相应对象的所有属性和方法名的列表: