1.今日内容大纲
一. 昨日内容回顾 1. 面向对象和面向过程 1. 面向过程: 侧重在过程. 事物的发展流程 优点: 编码和入门简单. 缺点: 可扩展性差. 2. 面向对象: 侧重在对象. 万事万物皆为对象. None 优点: 可扩展性强(多态) 缺点: 上手难. 写起来麻烦 在python中支持面向对象和面向过程. 使用哪一个你自己决定. 2. 如何写面向对象 1. 先创建类 class 类名: pass 2. 创建对象: 类名() 3. () 调用的是__init__() 构造方法. def __init__(self, 参数1,参数2, 参数3): # 属性的绑定 self.属性1 = 参数1 self.属性2 = 参数2 self.属性3 = 参数3 4. 方法(写在类中的函数) def method(self): pass self: 当前正在执行的对象 对象.method() 3. 三大特征: 封装: 把一些数据封装到一个对象中. 继承: 子类继承父类. 子类会自动拥有父类中除了私有内容外的其他所有内容, python是多继承. 多态: 多一个对象有多种形态 二. 作业讲解 三. 今天主要内容 成员 class Person: def __init__(self, name, num, gender, birthday): # 成员变量(实例变量) self.name = name self.num = num self.gender = gender self.birthday = birthday # 对象来访问(成员方法)(实例方法) def marray(self, duifang): print("人会结婚%s" % duifang) 成员: 在类中定义的变量和方法都被成为成员 变量 1. 成员变量(实例变量)(字段column) (重点) 2. 类变量(静态变量) 直接写在类中的. 共享出去的. 方法 1. 成员(实例)方法 加了self的.调用的时候。必须用对象去访问. (重点) 2. 类方法, 当方法需要传递类名的时候. 需要类方法. 规范规则: 在上方加@classmethod 3. 静态方法, 当你的方法不需要传递当前类的对象的时候。 语法规则:在方法上面加@staticmethod 面试题: 说一说, 静态方法, 类方法和实例方法的区别. 属性 用方法来描述我们的属性信息. 注意: 1. @propery 改变一个方法成为属性 2. 这个方法只能有一个参数, self 3. 必须有返回值. 私有 只能在自己类中访问. __方法 __变量 __类变量 都是私有. 比人访问不到. 包括他儿子. 明天: 类与类的关系. 组合, 嵌套, 调用. 继承.
2.练习
class Circle:
def __init__(self, r):
self.r = r
def zhouchang(self):
return 2 * 3.14 * self.r
def mianji(self):
return 3.14 * self.r * self.r
c = Circle(5)
print(c.zhouchang())
class Base1:
def f1(self):
print('base1,1')
def f2(self):
print('base1,f2')
def f3(self):
print('base2.f3')
self.f1()
class Base2:
def f1(self):
print('base2,f1')
class Foo(Base1, Base2):
def f0(self):
print("foo.f0")
self.f3()
f = Foo()
f.f0()
class User:
def __init__(self, username, password, email):
self.username = username
self.password = password
self.email = email
user_list = []
for i in range(3):
user = input("请输入用户名:")
pwd = input("请输入密码:")
email = input("请输入邮箱:")
u = User(user, pwd, email)
user_list.append(u)
else:
for u in user_list:
print("我叫%s, 邮箱是:%s" % (u.username, u.email))
class User:
def __init__(self, name, pwd):
self.name = name
self.pwd = pwd
class Account:
def __init__(self):
self.user_list = [] # 数据源
def login(self):
print("欢迎来到登录环节")
username = input("请输入用户名: ")
password = input("请输入密码:")
for u in self.user_list:
if u.name == username and u.pwd == password:
print("登录成功")
return
else:
print("登录失败")
def register(self):
print("欢迎来到注册环节")
uname = input("请输入用户名")
pwd = input("请输入密码")
u = User(uname, pwd)
self.user_list.append(u)
def run(self):
while 1:
print("1. 注册")
print("2. 登录")
num = input("请输入你要执行的操作(Q退出):")
if num == "1":
self.register()
elif num == "2":
self.login()
elif num.upper() == "Q":
print("退出")
break
else:
print("你是不是傻")
obj = Account()
obj.run()
3.变量
class Person:
country = "中国" # 类变量. 不属于对象, 对象可以访问.
def __init__(self, name, num, gender, birthday):
# 成员变量(实例变量)
self.name = name
self.num = num
self.gender = gender
self.birthday = birthday
# 对象来访问(成员方法)(实例方法)
def marray(self, duifang):
print("人会结婚%s" % duifang)
alex = Person("李杰", 10086, "男", "昨天")
alex.country = "澳大利亚" # 注意。 这里和类变量没由一毛钱关系, 给alex单独加一个属性叫country = ”澳大利亚“
wusir = Person("吴佩琪", 10010, "女", "今天")
print(alex.country) # 澳大利亚 # 拿到的是自己的。成员实例变量 字段
print(wusir.country) # 中国
print(Person.country) # 中国
# 总结:类变量,用类名去操作. 规范.
4.方法
class Person:
def __init__(self):
pass
# 实例方法需要传递类的对象 self
def think(self):
print("人能思考")
# 静态方法不需要传递对象或者类
@staticmethod # 静态方法
def jisuan(a, b):
print("我来过这里")
return a + b
# 类方法: 第一个参数传递的是类名
@classmethod
def clsMethod(cls): # cls表示的类
p = cls() # 可以动态的创建对象.
print("我是一个类方法", p)
# p = Person()
# p.think()
#
# Person.think(p)
# 静态方法的调用:
# c = Person.jisuan(1, 2) # 类名可以访问
# print(c)
#
# p = Person()
# d = p.jisuan(3, 5) # 用对象也可以访问
# print(d)
# 记住, 静态的内容用类名访问
Person.clsMethod() # 类方法默认第一个参数接收的是类名
5.属性
class Person:
def __init__(self, name, num, gender, birthday):
self.name = name
self.num = num
self.gender = gender
self.birthday = birthday
@property # 表示当前方法是一个属性. 方法的返回值就是这个属性的值
def age(self): # 方法只能有一个参数, self
return 10 # 必须有返回值
p = Person("alex", "10086", "不详", "1989年12月1日")
print(p.age) # 可以直接访问属性, 实际上访问的是age()方法. 返回值就是属性值
6.私有
class Tiger:
def __init__(self, name, waibiao, qingzhenglianjiedezuofeng, qingfu, money, fangchan):
self.name = name
self.waibiao = waibiao
self.qingzhenglianjiedezuofeng = qingzhenglianjiedezuofeng
self.__qingfu = qingfu
self.__money = money
self.__fangchan = fangchan
def buy(self):
print("我有%s" % self.__money)
self.__sel()
def __sel(self):
print("我要卖掉%s" % self.__fangchan)
lh = Tiger("alex", "正直", "非常刚正不阿, 666", "小潘潘", 10000000000, 5)
print(lh.qingzhenglianjiedezuofeng)
print(lh.name)
print(lh.waibiao)
lh.buy()
# lh.__sel()
# print(lh.__money)