码迷,mamicode.com
首页 > 其他好文 > 详细

中学面线对象,在我眼里所有的都是对象,哇卡卡卡

时间:2018-08-28 17:56:29      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:splay   建模   静态方法   私有字段   address   pen   属性   分享图片   编写   

来来来看看今天都学了什么.

没错就是成员(黑帮成员).嵌套(建模),

1. 成员

1 . 类的成员

class Foo:
    # 方法
    def __init__(self, name):
        # 实例变量/字段
        self.name = name
    # 方法
    def func(self):
        pass
# obj,Foo类的对象
# obj,Foo类的实例
obj = Foo(‘你好啊‘)

 成员呢,分为三类,

  1 .变量

  实例变量(字段)

    公有实例变量(字段)

    私有实例变量(字段)

  类变量(静态字段)

    公有类变量(静态字段)

    私有类变量(静态字段)

实例一

class Foo:
    # 类变量(静态字段)
    country = "中国"

    def __init__(self, name):
        # 实例变量(字段)
        self.name = name

    def func(self):
        pass

  

准则:
实例变量(字段)访问时,使用对象访问,即: obj1.name
类变量(静态字段)访问时,使用类方法,即: Foo.country (实在不方便时,才使用对象)
 什么时候用类变量?
当所有对象中有共同的字段时且要改都改要删都删时,可以将 实例变量(字段) 提取到 类变量(静态字段)

然后呢什么是私有实例变量(私有字段)看下面

class Foo:

    def __init__(self,name):
        # 私有实例变量(私有字段)
        self.__name = name
        self.age = 123

    def func(self):
        print(self.__name)

obj = Foo(‘略略略‘)
print(obj.age)
#obj.__name # 无法访问
obj.func()  # 找一个内部人:func, 让func帮助你执行内部私有 __name
技术分享图片
class Foo:
    country = "中国"

    def __init__(self):
        pass

    def func(self):
        # 内部调用
        print(self.country)
        print(Foo.country) # 推荐


# 外部调用
print(Foo.country)

obj = Foo()
obj.func()
类变量(静态字段)
技术分享图片
class Foo:
    __country = "中国"

    def __init__(self):
        pass

    def func(self):
        # 内部调用
        print(self.__country)
        print(Foo.__country)  # 推荐

# 外部无法调用私有类变量
# print(Foo.country)

obj = Foo()
obj.func()
私有类变量(私有静态字段)

思考题: 如何验证儿子都不知道私有字段的存在.

技术分享图片
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()
可以访问

  2方法

实例方法:必须用对象去调用  方法会用到类实例化对象,肯定要写成实例方法self.xxx=xxx  

静态方法:可以直接用类调用  如果写了个类 对于对象一个都不用,根本没必要实例化直接写成Foo.display()  @staticmethod还有默认的self不用带了

类方法:@classmethod  

技术分享图片
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):
        elf.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


    def __display(self,arg):
        print(私有方法,arg)

    def func(self):
        self.__display(123)

obj = Foo()
# obj.__display(123) # 无法访问
obj.func()
私有的实例方法
技术分享图片
class Foo(object):


    def __init__(self):
        pass

    @staticmethod
    def __display(arg):
        print(私有静态 方法,arg)

    def func(self):
        Foo.__display(123)

    @staticmethod
    def get_display():
        Foo.__display(888)

# Foo.__display(123) 报错

obj = Foo()
obj.func()

Foo.get_display()
私有的静态方法

 


总结
1. 定义时:
- 方法上方写: @classmethod
- 方法的参数: 至少有一个cls参数
2. 执行时:
- 类名.方法名() # 默认会将当前类传到参数中.
3. 什么时用?
- 如果在方法中会使用到当前类,那么就可以使用类方法.

  3 .属性(通过方法改造出来的)

技术分享图片
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

嵌套

创建三个学校且三个学校的设施内容等都是一致.

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()

  

 

中学面线对象,在我眼里所有的都是对象,哇卡卡卡

标签:splay   建模   静态方法   私有字段   address   pen   属性   分享图片   编写   

原文地址:https://www.cnblogs.com/xihuanniya/p/9549010.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!