Python基础(七)

1.多态

        定义时的类型和运行时的类型不一样,即同一种行为对于不同的子类有不同 的行为表现。

        前提:1.继承,多态必须发生在父类子类之间。2.重写,重写父类方法。

2.鸭子类型

        在程序设计中鸭子类型是动态类型的一种风格。在这种类型中一个对象不是由继承自特定的类或实现特定的接口,而是由当前方法和属性的集合决定。在此类型中,关注的不是对象的类型本身,而是它如何使用。

3.python是一种弱类型语言

4.私有化属性

        为了更好的保证属性安全,不能随意修改,将属性定义为私有属性。私有属性不能在类外部使用,以及继承的子类也无法使用。

        语法:以两个下划线开头

class person(object):
    def __init__(self,name,age):
        self.name=name
        self.__age=age
    def __str__(self):
        return f"{self.name}'s age is {self.__age}"
xm=person('xiaoming',20)
print(xm)#内部的str方法访问name和__age
print(xm.name)
print(xm.__age)

        对私有化属性的访问和修改。

class person(object):
    def __init__(self,name,age):
        self.name=name
        self.__age=age
    def __str__(self):
        return f"{self.name}'s age is {self.__age}"
    def get_age(self):
        return self.__age
    def set_age(self,age):
        self.__age=age
xm=person('xiaoming',20)
print(xm)
print(xm.get_age())
xm.set_age(23)
print(xm)
print(xm.get_age())

输出:
xiaoming's age is 20
20
xiaoming's age is 23
23

 5.私有化方法

        私有化方法的概念与私有化属性相同,有些方法不允许外部调用,或防止子类重写,将方法设置为私有化方法。

class A(object):
    def __fun1(self):
        print("private")
    def fun1(self):
        print('public')
a=A()
a.fun1()
a.__fun1()#此语句会出错

6.其它知识点

def fun1(musen: Animal):  
    musen.fun()

这里的musen: Animal是函数的类型注解。它告诉读者,这个函数期望musen参数是一个Animal类型(或者Animal类型的子类)的实例。
但是也可以接收不是Animal类型的实例,Python解释器不会报错,但可能会在运行时抛出AttributeError,如果那个实例没有fun方法的话。
如果你希望确保fun1函数只接收Animal类型或其子类的实例,你可以使用运行时类型检查,但这通常不是Python的推荐做法,因为它违背了Python的动态类型特性。然而,在某些情况下,为了代码的健壮性,你可能会选择这样做:
def fun1(musen):  
    if not isinstance(musen, Animal):  
        raise TypeError("Expected an instance of Animal or its subclass")  
    musen.fun()
isinstance() 是 Python 中的一个内置函数,用于判断一个对象是否是一个已知的类型。这个函数会考虑子类的情况,即如果一个对象是某个类的子类的一个实例,那么 isinstance() 也会返回 True。
isinstance() 的基本语法是:
isinstance(object, classinfo)
其中:
object 是要检查的对象。
classinfo 可以是直接或间接类名、基本类型或者由它们组成的元组。
如果 object 是 classinfo 的实例,或者 object 是 classinfo 的子类的一个实例,那么 isinstance() 返回 True,否则返回 False。

7.单下划线,双下划线和头尾双下划线的说明

        _xxx:表示的是protected类型的变量,保护类型,只允许其本身和子类进行访问,不能使用from xxx import * 的方式导入。

        __xxx__:魔法方法,开发者不允许创建此类型方法。

        xxx_:避免属性名与python关键字冲突。

        __xxx:私有化

8.属性函数

        property,访问私有化属性和方法。

class test(object):
    def __init__(self,num):
        self.__num=num
    def get_num(self):
        return self.__num
    def set_num(self,num):
        self.__num=num
    pro=property(get_num,set_num)
xm=test(1)
print(xm.pro)
xm.pro=2
print(xm.pro)


在Python中,property() 是一个内置函数,用于在新式类(即继承自 object 的类)中返回属性值。它通常用于实现所谓的“托管属性”(managed attributes),即这些属性的访问和修改不是直接进行的,而是通过一些方法(如 getter、setter 和 deleter)来控制的。

property() 函数可以接受一到四个参数:

fget:一个用于获取属性值的方法(getter)。
fset:一个用于设置属性值的方法(setter)。
fdel:一个用于删除属性的方法(deleter)。
doc:属性的文档字符串(可选)。
class test(object):
    def __init__(self,num):
        self.__num=num
    @property
    def num(self):
        return self.__num
    @num.setter
    def num(self,num):
        self.__num=num
xm=test(2)
print(xm.num)
xm.num=9
print(xm.num)



在Python中,@property是一个内置的装饰器,
用于将方法转化为属性的getter方法。这意味着
你可以像访问数据属性一样访问方法,而无需在调用时使用括号。
此外,你还可以使用@<name>.setter
和@<name>.deleter装饰器
来定义属性的setter和deleter方法。

9.单例模式

        单例模式 是一种常用的软件设计模式,主要目的是确保一个类仅有一个实例,并提供一个全局访问点来访问该实例。在很多情况下,一个系统中只需要一个唯一的对象来协调系统的整体行为,例如系统日志对象、配置文件读取对象、线程池对象等。这些对象如果使用单例模式来创建,就能避免重复创建对象造成的资源浪费,并可以更方便地访问和管理这些对象。

单例模式的实现通常包含以下几个步骤:

  1. 私有化构造函数:通过将类的构造函数设为私有,可以防止外部代码通过new关键字来创建类的实例。
  2. 提供静态的公有方法来获取实例:这个方法通常会被命名为getInstance()或类似的名称。在这个方法中,会先判断是否已经创建了类的实例。如果已经创建,则直接返回该实例;否则,先创建实例,并保存下来,然后再返回。
  3. 确保线程安全:在多线程环境下,需要确保getInstance()方法的线程安全,以避免多个线程同时创建实例导致的问题。这可以通过同步代码块、双重检查锁定等方式来实现。
class test(object):
    _instance=None
    def __new__(cls):
        if cls._instance is None:
            cls._instance=super().__new__(cls)
        return cls._instance
a=test()
b=test()
print(id(a))
print(id(b))

 

10.运算符

算术运算符:
+:加法
-:减法
*:乘法
/:除法(返回浮点数结果)
//:整数除法(返回商的整数部分)
%:取模(返回除法的余数)
**:乘方(如a ** b表示a的b次方)

比较运算符(也称为关系运算符):
==:等于
!=:不等于
>:大于
<:小于
>=:大于等于
<=:小于等于

赋值运算符:
=:简单的赋值运算符
+=:加法赋值运算符(如a += b相当于a = a + b)
-=:减法赋值运算符
*=:乘法赋值运算符
/=:除法赋值运算符
//=:整数除法赋值运算符
%=:取模赋值运算符
**=:乘方赋值运算符

位运算符:
&:按位与
|:按位或
^:按位异或
~:按位取反
<<:左移
>>:右移

逻辑运算符:
and:逻辑与
or:逻辑或
not:逻辑非

成员运算符:
in:检查一个值是否存在于一个序列中(如列表、元组或字符串)
not in:检查一个值是否不存在于一个序列中

身份运算符:
is:检查两个对象是否是同一个对象(即它们的内存地址是否相同)
is not:检查两个对象是否不是同一个对象

运算符优先级:
Python运算符具有不同的优先级,例如乘法和除法的优先级高于加法和减法。你可以使用括号来改变运算的优先级。

三元运算符(条件表达式):
a if condition else b:如果condition为真,则返回a,否则返回b。

11.__new__()

    __new__方法的作用是,创建并返回一个实例对象,调用一次返回一个对象。
 继承自object的类才有此魔法方法。
 注意:
    __new__是在对象实例化时调用的第一个方法
    __new__至少有一个参数cls,代表要实例化的类,此参数由解释器自动提供,其它参数直接传给__init__方法
    __new__没有返回实例对象,__init__方法就不会调用
    在__new__方法中,不能调用自己的__new__方法,即return cls.__new__(cls),否则会出错
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值