python入门(9)
类的案例
class DogInfo(object):
def __init__(self):
# 初始化操作,定义的是属性,实例属性
self.leg=leg
def bark(self):
print("狗会叫")
注意:
- self这个形参,代表的就是实例对象,在使用过程中自动调用
- 在init这个魔法方法里,定义的都是实例的属性
- DogInfo()创建的是实例化对象,注意,init方法会自动调用
- 先调用__new__()方法,后调用__init__()方法
###通过类创建实例
实例 = 类名()
注意点:
如果有init需要传参,那么()中需要填写,init的参数
调用实例的属性
在类的内部调用
class DogInfo(object):
def __init__(self,leg):
# 初始化操作,定义的是属性,实例属性
self.leg=leg
def bark(self):
# 在方法中调用实例属性
print(self.leg)
print("狗会叫")
注意点:
在方法中调用的实例属性,通过self.属性名,调用。因为self指向的就是实例
在类的外部调用
- 创建实例DogInfo(4)
- 调用实例
class DogInfo(object):
def __init__(self):
# 初始化操作,定义的是属性,实例属性
self.leg=leg
def bark(self):
# 在方法中调用实例属性
print(self.leg)
print("狗会叫")
dog = DogInfo(4)
dog.name
注意点:
在类的外部,通过创建对象来调用我们的实例属性
通过实例调用方法
在类的外面调用方法
class DogInfo(object):
def __init__(self,leg):
# 初始化操作,定义的是属性,实例属性
self.leg=leg
def bark(self):
# 在方法中调用实例属性
print(self.leg)
print("狗会叫")
dog=DogInfo(4)
dog.bark()
注意点:
通过实例调用
如果方法需要传参,在方法的()传入
在类的内部调用方法
class DogInfo(object):
def __init__(self,leg):
# 初始化操作,定义的是属性,实例属性
self.leg=leg
def bark(self):
# 在方法中调用实例属性
print(self.leg)
print("狗会叫")
def use_bark(self):
self.bark()
dog=DogInfo(4)
dog.use_bark()
在类的内部调用,self.方法名
动态添加临时属性并获取
class DogInfo(object):
def __init__(self,leg):
# 初始化操作,定义的是属性,实例属性
self.leg=leg
def bark(self):
# 在方法中调用实例属性
print(self.leg)
print("狗会叫")
def use_bark(self):
self.bark()
dog=DogInfo(4)
dog.use_bark()
dog.name="小白"
print("临时属性的访问",dog.name)
注意点:
-
关于实例属性与临时属性区别
实例属性,是只要通过当前类创建,都有的
临时属性,是一个实例具有的,其他的对象可有可无
-
在写web的时候,可能会为了方便起见
init new 方法
def __init__(self): # known special case of object.__init__
""" Initialize self. See help(type(self)) for accurate signature. """
pass
def __new__(cls, *more): # known special case of object.__new__
""" Create and return a new object. See help(type) for accurate signature. """
pass
注意点:
- new方法创建并且返回新实例对象
- init方法完成实例的初始化
- new先用
str方法
class DogInfo(object):
def __init__(self,leg):
# 初始化操作,定义的是属性,实例属性
self.leg=leg
def bark(self):
# 在方法中调用实例属性
print(self.leg)
print("狗会叫")
def use_bark(self):
self.bark()
dog=DogInfo(4)
print(dog)
# <__main__.DogInfo object at 0x0000020CAFAA7A90>
class DogInfo(object):
def __init__(self,leg):
# 初始化操作,定义的是属性,实例属性
self.leg=leg
def bark(self):
# 在方法中调用实例属性
print(self.leg)
print("狗会叫")
def use_bark(self):
self.bark()
def __str__(self):
return "狗类"
dog=DogInfo(4)
print(dog)
# 狗类
注意点:
- 返回string类型
实例属性的更改
实例外部的更改
class DogInfo(object):
def __init__(self,leg):
# 初始化操作,定义的是属性,实例属性
self.leg=leg
def bark(self):
# 在方法中调用实例属性
print(self.leg)
print("狗会叫")
def use_bark(self):
self.bark()
def __str__(self):
return "狗类"
def showleg(self):
print("狗腿为:",self.leg)
dog=DogInfo(4)
dog.showleg()
dog.leg=5
dog.showleg()
实例内部修改
class DogInfo(object):
def __init__(self,leg):
# 初始化操作,定义的是属性,实例属性
self.leg=leg
def bark(self):
# 在方法中调用实例属性
print(self.leg)
print("狗会叫")
def use_bark(self):
self.bark()
def __str__(self):
return "狗类"
def showleg(self):
print("狗腿为:",self.leg)
def new_leg(self,leg):
self.leg=leg
dog=DogInfo(4)
dog.showleg()
dog.new_leg(5)
dog.showleg()
继承
####继承
class ChickenSoup(object):
def __init__(self):
self.name="祖传鸡汤"
def cook(self):
print("做法:***********")
class NewChickenSoup(ChickenSoup):
def __init__(self):
self.name="鸡汤2.0"
new=NewChickenSoup()
new.cook()
print("鸡汤的名字:",new.name)
注意点:
- 子类可以使用父类的属性和方法
- 如果子类方法与父类同名,使用子类自己的属性
- 如果子类有__init__方法,没有特殊操作,不能直接调用父类的属性
多继承
class ChickenSoup(object):
def __init__(self):
self.name="祖传鸡汤"
def cook(self):
print("做法:***********")
class NewEast(object):
def bbq(self):
print("烧烤秘方")
def birdsoup(self):
print("鸽子汤")
class NewChickenSoup(ChickenSoup,NewEast):
def __init__(self):
self.name="鸡汤2.0"
new=NewChickenSoup()
new.cook()
print("鸡汤的名字:",new.name)
注意点:
当前类继承于多个类,多个类写在括号中
多层继承
class ChickenSoup(object):
def __init__(self):
self.name="祖传鸡汤"
def cook(self):
print("做法:***********")
class NewEast(object):
def bbq(self):
print("烧烤秘方")
def birdsoup(self):
print("鸽子汤")
class NewChickenSoup(ChickenSoup,NewEast):
def __init__(self):
self.name="鸡汤2.0"
new=NewChickenSoup()
new.cook()
print("鸡汤的名字:",new.name)
NewChickenSoup----------->NewEast---------------->object
查找顺序
print(NewChickenSoup.__mro__)
(<class '__main__.NewChickenSoup'>, <class '__main__.ChickenSoup'>, <class '__main__.NewEast'>, <class 'object'>)
注意点:
多继承的查找顺序与继承的类的位置有关系
父类–子类 基类—派生类
私有属性和私有方法
class NewEast(object):
def __init__(self):
self.__money="2亿"
def bbq(self):
print("烧烤秘方")
def birdsoup(self):
print("鸽子汤")
class NewChickenSoup(NewEast):
def cook(self):
print("!!!!!!!!!!!!!!!!!!!!!")
new=NewChickenSoup()
# print(new.money)
xx=NewEast()
print(xx.__money)
注意点:
- 私有属性:__属性名,不能被子类调用,也不能被自己的实例调用
- 但是私有属性,可以在类的内部进行调用
保护属性和保护方法
def __init__(self):
self._money="2亿"
一个下划线
重写与调用父类的方法
class NewEast(object):
def cook(self):
print("鸽子汤")
class NewChickenSoup(NewEast):
def cook(self):
print("!!!!!!!!!!!!!!!!!!!!!")