10 面向对象基础(三)

10.1私有属性和私有方法

class Dog(object):

    def __init__(self):
        self.__age = 10  # 在属性名前面加俩下划线,将属性私有化,这个属性称为私有属性(一般不允许对象来访问修改这个属性)

    # def __fn(self):
    #     print("私有方法")

    def get_age(self):
        return self.__age

    def set_age(self, num):
        if 0 < num <= 22:
            self.__age = num


dog = Dog()
# dog.age = 111

# print(dog.__age)
# dog.fn()
# print(dog.get_age())
dog.set_age(30)
print(dog.get_age())

10.2 共有属性的继承问题

class Animal(object):

    def __init__(self):
        self.age = 10
        self.num = 200


class Dog(Animal):

    def __init__(self):  # 属性是写在init初始化方法里面的,一旦子类定义了这个init方法,就会把父类的init方法重写了, 导致了dog = Dog()在调用init方法的时候,调用的是子类的init方法
        super().__init__()   # 在初始化中的super().__init__() 的时候,把这句代码写在最前
        self.name = "狗"
        self.num = 300

    # pass

dog = Dog()
print(dog.name)
print(dog.age)
print(dog.num)

10.3 私有属性的继承问题

"""
公有属性可以继承到子类,只是要注意重写init方法的问题
我们认为私有属性不继承
"""


class Animal(object):

    def __init__(self):
        self.__age = 10
        self.num = 200

# ani = Animal()
# print(ani._Animal__age)   # 了解


class Dog(Animal):

    def __init__(self):  # 属性是写在init初始化方法里面的,一旦子类定义了这个init方法,就会把父类的init方法重写了, 导致了dog = Dog()在调用init方法的时候,调用的是子类的init方法
        super().__init__()   # 在初始化中的super().__init__() 的时候,把这句代码写在最前
        self.name = "狗"
        self.num = 300

    # pass

dog = Dog()
print(dog.name)
print(dog.__age)  # 操作
print(dog.num)

10.4多态

"""

面向对象语言的三大特性: 封装、继承、多态


多态: 一种事物多种形态  (前提:子类是父类的另外一个形态)
"""


class A(object):
    def say(self):
        print("---Asay")


class B(object):
    def say(self):
        print("---Bsay")


class C(object):
    def say(self):
        print("---Csay")


def fn(obj):
    obj.say()

a = A()
b = B()
c = C()

fn(c)

10.5类属性和实例属性

"""
类属性的定义:在类里面,在方法之外 定义的,不用带self 
特点:类属性在各个对象之间共享


如何访问类属性:
1、类对象.类属性     Dog.num    (最推荐的写法)
2、实例对象.类属性 (不推荐这么用)
3、实例对象.__class__.类属性  (了解)
4、在类方法中, 通过  cls.num
"""


class Dog(object):   # 类对象

    num = 100  # 类属性 ,是给类对象使用

    def __init__(self):
        self.age = 10   # 实例属性, 是给实例对象去使用的,在各个对象之间互相独立,互不干扰
        # self.num =

dog = Dog()   # 创建对象,创建实例, 创建实例对象,实例化一个对象
# print(dog.age)

dog1 = Dog()
dog1.age = 11
print(dog1.age)  # 11
print(dog.__class__.num)  # 100
dog1.__class__.num = 300
print(dog.__class__.num)  # 300

"""
类属性的定义:在类里面,在方法之外 定义的,不用带self 
特点:类属性在各个对象之间共享


如何访问类属性:
1、类对象.类属性     Dog.num    (最推荐的写法)
2、实例对象.类属性 (不推荐这么用)
3、实例对象.__class__.类属性  (了解)

"""


class Dog(object):   # 类对象

    numb = 0  # 类属性 ,是给类对象使用

    def __init__(self):
        self.age = 10   # 实例属性, 是给实例对象去使用的,在各个对象之间互相独立,互不干扰
        # self.num =
        # self.numb = 0
        Dog.numb += 1

dog = Dog()   # 创建对象,创建实例, 创建实例对象,实例化一个对象

dog1 = Dog()
dog2 = Dog()

print(Dog.numb)

10.6类方法和静态方法

"""
类方法定义的格式:
@classmethod   # 装饰器、修饰器
def 方法名(cls): 
    # cls和类名的指向是同一个
    # 类方法一般用来修改类属性


如何调用类方法:
1、类名.方法名()      Dog.fn()
2、对象.__class__.方法名()      dog.__class__.fn()
"""


class Dog(object):   # 类对象
    num = 10

    def __init__(self):
        self.age = 10   # 实例属性, 是给实例对象去使用的,在各个对象之间互相独立,互不干扰

    def eat(self):    # 实例方法
        print("--吃")

    @classmethod   # 装饰器、修饰器
    def fn(cls):   # 类方法   cls 接收的是类对象
        # print(Dog.num)
        print(cls.num)

    @staticmethod
    def fn02():   # 静态方法
        print("这是静态方法")

    @staticmethod
    def welcome():   # 静态方法
        print("-" * 30)
        print("--------名片管理器v1.0--------")
        print("----1、添加名片")
        print("----2、删除名片")
        print("----3、修改名片")
        print("----4、查询名片")
        print("----5、查询所有名片")
        print("----6、退出系统")
        print("-" * 30)


dog = Dog()
# dog.eat()

Dog.fn()  # 10
dog.__class__.fn()  # 10
Dog.welcome()

10.7__new__()

"""
    def __new__(cls):   # 作用: 返回出新创建出来的对象
        return super().__new__(cls)   # super().__new__(cls)是在调用object的new方法,object的new方法做了:创建出了新对象并且返回出这个对象, 一旦执行了super().__new__(cls),就会有一个新对象产生


dog = Dog()

1、创建对象    __new__()   返回了这个对象
2、创建对象成功之后, 调用init方法
"""


class Dog(object):

    def __new__(cls):   # 作用: 返回出新创建出来的对象
        # pass
        return super().__new__(cls)   # super().__new__(cls)是在调用object的new方法,object的new方法做了:创建出了新对象并且返回出这个对象
        # 结论:一旦执行了super().__new__(cls),就会有一个新对象产生

    def __init__(self):
        self.age = 10

dog = Dog()
print(dog)
print(dog.age)

10.8单例模式

"""

    def __init__(self, name, age):
        if 第一初始化:
            self.name = name
            self.age = age
"""


class King(object):

    __instance = None
    __isFirst = True

    def __new__(cls, name, age):
        # if not King.__instance:
        #     King.__instance = super().__new__(cls)
        #     return King.__instance
        # else:
        #     return King.__instance
        if not King.__instance:
            King.__instance = super().__new__(cls)

        return King.__instance

    def __init__(self, name, age):
        if King.__isFirst:
            self.name = name
            self.age = age
            King.__isFirst = False

king1 = King("嬴政", 40)
print(king1.name)
king2 = King("秦始皇", 42)
print(king1.name)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值