017-2018-09-26 面向对象-成员

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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值