
#类
class 类名:
def func(self):
print('类中的实例方法')
实例=类名()
实例.func()
#封装.
# #把几个属性封装到对象中
class ren:
def __init__(self,name,age,gender,hobby):
self.name=name
self.age=age
self.gender=gender
self.hobby=hobby
ren1=ren('小明',18,'男','玩耍')
print(ren1.name)
#继承
#派生类继承基类的属性和动作
class animal:
huxi=True
def chi(self):
print('吃')
def shui(self):
print('睡')
def he(self):
print('喝水')
class cat(animal):
def zhualaoshu(self):
print('抓老鼠')
class dog(animal):
def chaijia(self):
print('拆家')
cat1=cat()
cat1.chi()
cat1.shui()
cat1.he()
cat1.zhualaoshu()
print(cat1.huxi)
#多态
#类中的实例方法a可以是任何类型的数据,
# 可以是官方给定的数据类型.可以是自己定义的类.
class foo:
def func1(self,a):
print(type(a))
return type(a)
shili=foo()
shili.func1(True)
shili.func1(1)
shili.func1(1.2)
shili.func1("hahah")
shili.func1({12,123})
shili.func1([1,1,23,34])
shili.func1((1,2,3,4))
shili.func1({'k1':12,'k2':15})
shili.func1(cat1)
shili.func1(ren1)
#类方法
class Foo1:
@classmethod
def func(cls,a1):
print(a1)
shili1=Foo1()
shili1.func('你好1')
Foo1.func('你好2')
#实例方法
class Foo2:
def func(self,a1):
print(a1)
shili2=Foo2()
shili2.func('你好3')
Foo2.func(shili2,'你好4')#用类强行执行实例方法,
#类和函数的区别:
#在面向对象编程中方法是类里面编写的函数
#1 定义时,实例方法至少需要一个self形参
#2 调用时,实例方法需要通过实例对象来调用
#在面向过程编程中,函数就是对某些动作和功能的封装
#1 定义时,可以不传参数
#2 调用时,只需要函数名()就可以
#__new__与__init__
#构造方法是__new__,会为对象创建一个内存空间,并把这个内存空间的地址返回给
#初始化方法__init__.
1. 面向对象帮你解决什么问题? 封装: 归类,将函数放置到一个类中. 打包,将数据打包放到一个对象.
2. 三大特性 封装 继承 多态,Python原生支持多态,崇尚鸭子模型.由于Python函数传参时,无序指定类型: def func(arg): # arg可以是多种类型,只要其中有send方法即可.
arg.send()
3. 编写面向对象程序
归类+提取公共值
4. self到底是谁?
self参数是Python帮助我们自动传递.
如果执行面向对象中的方法时,前面必须有一个对象: xxx.func()
class Foo:
def f1(self):
pass
def f2(self):
self.f1()
obj = Foo()
obj.f2()
5. Python支持多继承
6. 类的成员
class Foo:
# 方法
def __init__(self,name):
# 实例变量/字段
self.name = name
# 方法
def func(self):
pass
# obj,Foo类的对象
# obj,Foo类的实例
obj = Foo('朱奎峰')
成员共分为三类:
变量:
- 实例变量(字段)
- 公有实例变量(字段)
- 私有实例变量(字段)
- 类变量(静态字段)
- 公有类变量(静态字段)
- 私有类变量(静态字段)
实例一:
class Foo:
# 类变量(静态字段)
country = "中国"
def __init__(self,name):
# 实例变量(字段)
self.name = name
def func(self):
pass
obj1 = Foo('季红')
obj2 = Foo('王晓东')
Foo.country
思考题: 如何验证儿子都不知道私有字段的存在.
无法访问:
class Base(object):
__secret = "受贿"
class Foo(Base):
def func(self):
print(self.__secret)
print(Foo.__secret)
obj = Foo()
obj.func()
可以访问:
class Base(object):
__secret = "受贿"
def zt(self):
print(Base.__secret)
class Foo(Base):
def func(self):
print(self.__secret)
print(Foo.__secret)
obj = Foo()
obj.zt()
方法:
- 实例方法
class Foo(object):
def __init__(self, name):
self.name = name
# 实例方法
def func(self):
print(self.name)
obj = Foo('..')
obj.func()
- 静态方法
class Foo(object):
def __init__(self, name):
self.name = name
# 静态方法,如果方法无需使用对象中封装的值,那么就可以使用静态方法
@staticmethod
def display(a1,a2):
return a1 + a2
Foo.display(1,3)
- 类方法
class Foo(object):
# 类方法,cls是类
@classmethod
def show(cls,x1,x2):
print(cls,x1,x2)
# 执行类方法
Foo.show(1,8)
面试题: 静态方法/类方法和实例方法的区别?
属性(通过方法改造出来):
示例:
class Foo(object):
def __init__(self):
pass
@property
def start(self):
return 1
@property
def end(self):
return 10
obj = Foo()
print(obj.start)
print(obj.end)
"""
# 总结:
# 1. 编写时
# - 方法上方写 @property
# - 方法参数:只有一个self
# 2. 调用时:无需加括号 对象.方法
# 3. 应用场景: 对于简单的方法,当无需传参且有返回值时,可以使用 @property
"""7. 嵌套
面向对象:
"""
创建三个学校且三个学校的设施内容等都是一致.
"""
class School(object):
def __init__(self, name, address):
self.name = name
self.address = address
def speech(self):
print('讲课')
obj1 = School('北京校区', '昌平')
obj2 = School('上海校区', '浦东')
obj3 = School('深圳校区', '南山')
class Teacher(object):
def __init__(self, name, age, salary):
self.name = name
self.age = age
self.__salary = salary
self.school = None
t1 = Teacher('李', 19, 188888)
t2 = Teacher('赵', 18, 60)
t3 = Teacher('张',16, 900000)
# ############## 老师分配校区
t1.school = obj1
t2.school = obj1
t3.school = obj2
# ####################################
# 查看t1老师,所在的校区名称/地址
print(t1.school.name)
print(t1.school.address)
print(t1.name)
print(t1.age)
t1.school.speech()
准则: 字段和方法的归类.
以前:
[
{"name":'alex1','age':18,xxx:999},
{"name":'alex2',age':18},
]