#第八章面向对象
"""类的成员:
一、类属性和实例属性
1.类属性:(类内部方法外部) 类和对象都可访问 通过类修改
2.实例属性:(方法内部) 只能由对象访问 通过对象修改
可动态添加实例属性
二、实例方法 类方法 静态方法
1.实例方法:(类内部,以self为第一个形参)只能通过对象调用
2.类方法:(类内部,使用修饰器修饰 cls第一个形参) 类和对象都可以调用 可以通过cls访问修改类属性
3.静态方法:(类内部,修饰器修饰,无默认参数) 类和对象都可以调用 方法内部不能直接访问属性或方法,但可以使用类名访问属性或调用类方法
三、私有成员
在类成员名称前添加双下划线__
私有成员只能在类内部直接访问 但可以在类外部通过类的公有方法直接访问
"""
"""特殊方法:
一、构造方法(对对象初始化) __inint__()无参 __init__(self)有参
1.无参构造:对象属性具有相同的初始值
2.有参构造:对象属性具有不同的初始值
二、析构方法(销毁) __del__()销毁对现系统自动调用
"""
class A:
whells=4 # 内属性 在类内方法外
__whe=5 #私有属性
def shili(self): #实例方法
self.whell=4 #实例属性 在方法内部声明
print("我是实例方法")
def lei(cls):
print("我是类方法")
def jingtai():
print("我是静态方法")
def __siyou(self):
print("我是私有方法")
def test(self):
print(__whe) #访问私有属性
self.__siyou() #调用私有方法
a=A() #创建对象
#print(A.whell) #错误,实例属性只能通过对象访问
print(a.whell) #正确
a.add()
a.whell=3 #修改实例属性
a.color="red" #动态添加实力属性
a.test() #通过调用公有方法访问私有属性方法
""" 封装 继承 多态
一、封装:对外隐藏类的细节,提供访问类成员的公开接口
要求:1.将属性设为私有属性
2.添加两个供外界调用的公有方法 set(),get()方法
二、继承:子类继承父类会自动拥有父类的公有成员,不能访问父类私有成员
1.单继承:class 子类名(父类名):
2.多继承:class 子类名{父类名1,父类名2...} 子类先继承哪个类就先调用哪个类方法
3.重写:在子类中重写与父类同名的方法,再按要求重新编写代码功能
三、多态:让不同类的同一功能通过同一接口调用,并表现出不同的行为
四、运算符重载:赋予内置运算符新功能
"""
#封装
class B:
def __init__(self,name):
self.name=name
self.__age=1
def set_age(self,new_age): #设置接口
self._age=new_age
def get_age(self): #获得接口
return self._age
#继承
class F:
def __init__(self,color): #有参构造
self.color=color #形参赋给属性
self.__age=1 #私有属性
def walk(self): #实例方法
print("走路")
def __text(self): #私有方法
print("父类私有方法")
def text(self):
print("F类测试")
class F2:
def __init__(self):
self.high=3
def run(self):
print("跑步")
def text(self):
print("F2类测试")
class Z(F,F2):
def wolk(self): #重写父类的walk方法
print("小孩在走路") #新功能
z=Z("red") #创建子类对象
print(z.color)
#print(z._age) #错误,子类不能调用父类私有属性方法
z.walk()
z.run()
z.text()
#多态
class Cat:
def shout(self):
print("喵~")
class Dog:
def shout(self):
print("汪~")
def shout(obj): #定义接口
obj.shout()
cat=Cat()
dog=Dog()
shout(cat)
shout(dog)