Python:对象
一、初识对象
1、创建对象
##设计类class Student:name = None; ##这是成员变量age = None;def sayHi(self): ##成员方法print(f"Hi大家好,我叫{self.name}")##创建对象
stu_1 = Student();##对象属性赋值
stu_1.name = '周杰伦';
stu_2.age = 20;
2、成员方法
##成员方法def 方法名(self,形参1,形参2....,形参N)方法体self关键字是成员方法定义的时候,必须填写的。
·它用来表示类对象自身的意思
·当我们使用类对象调用方法的是,self会自动被python传入
·在方法内部,想要访问类的成员变量,必须使用self
·self关键字,尽管在参数列表中,但是传参的时候可以忽略它
3、构造方法
##构造方法Python类可以使用 __init__()方法,称之为构造方法·在创建类对象(构造类)的时候,会自动执行
·在创建类对象(构造类)的时候,将传入参数自动传递给__init__方法使用。eg:
class Student:name = None;age = None;address = None; //如果下面有 构造函数 上面的成员变量可以省去def __init__(self,name,age,address):self.name = name;self.age = age;self.address = address;stu = Student("周杰伦",18,"中国台北")
4、字符串方法
##字符串方法 类似java中的toStringdef __str__(self)return f"name : {name},age: {age},address: {address}";
5、比较方法
def __lt__(self,other)return self.age < other.age;
def __le__(self,other)return self.age <= other.age;
def __eq__(self,other)return self.age == other.age;注意 原来是比较内存地址,如果实现了__eq__方法,比较的就是方法里面的内容
如:t1 = Tearcher("苍井空","female",19);
t2 = Tearcher("武藤兰","female",19);
print(t1==t2)
方法 | 功能说明 |
---|
__init__ | 构造方法,可用于创建类对象的时候设置初始化行为 |
__str__ | 用于实现类对象转字符串的行为(如 print(obj) 时显示自定义信息) |
__lt__ | 用于两个类对象进行小于(<)或大于(>)比较(如 a < b ) |
__le__ | 用于两个类对象进行小于等于(<=)或大于等于(>=)比较(如 a <= b ) |
__eq__ | 用于两个类对象进行相等比较(如 a == b ) |
6、私有成员
##私有成员·私有成员变量:变量名以__开头
·私有成员方法:方法名以__开头##注意:私有成员是供内部使用的,不是对外使用的
##类对象无法访问私有成员
##类中的其他成员可以访问私有成员eg:
class Student2:__name = None;__gender = None;__age = None;def __init__(self,name,gender,age):self.__name = name;self.__gender = gender;self.__age = age;def __sayHi(self):print(f"Hi大家好,我叫{self.__name}")def guessAge(self,age):if self.__age == age:print("真不错,猜对了");else:print("不好意思你猜错了");s1 = Student2("方文山","female",19);
__name = "林俊杰"; ##不报错,但无效
s1.__sayHi(); ##会报错
print(s1.__name); ##会报错
s1.guessAge(19); ##真不错,猜对了
eg:
class Phone:number = None;__is_5g_open = False;def __init__(self,number):self.number = number;def check5GOpen(self):return self.__is_5g_open;def call_by_5g(self):self.__is_5g_open = True;p1 = Phone("18310103915");
print(f"检查5G是否开启:{p1.check5GOpen()}");
p1.call_by_5g();
print(f"检查5G是否开启:{p1.check5GOpen()}");
二、继承
##语法class 新类(父类):##多继承语法
class 新类(父类1,父类2...,父类N):##注意:如果多继承的父类有相同的属性或方法,则谁先被继承谁优先,即优先使用前面的如果自己有实现,优先使用自己的##eg:
class Phone:phoneNumber = None;picture = None;def __init__(self, phoneNumber):self.phoneNumber = phoneNumber;def call_by_4g(self,number):print(f"4g通话,{self.phoneNumber}正在和{number}通话...")class Phone17Plus(Phone):faceId = None;def call_by_5g(self,number):print(f"5g通话,{self.phoneNumber}正在和{number}通话...")p17 = Phone17Plus("18310103915");
p17.call_by_4g("18748156255");
p17.call_by_5g("18830187927");
##pass占位pass 在 Python 中是一个特殊的语句,它实际上什么也不做。它的主要作用是作为一个占位符,用于那些语法上需要语句但逻辑上暂时不需要执行任何操作的地方。##eg:
class MyClass:pass # 占位符,表示该类暂时没有其他内容def my_function():pass # 这里将来会添加函数的具体逻辑
##eg:
if condition_a:do_something()
elif condition_b:pass # 目前对 condition_b 不采取任何行动
else:do_another_thing()##eg:
for item in my_list:if some_condition(item):process_item(item)else:pass # 对于不满足条件的项,暂时不做任何处理
##复写:
子类继承父类的成员属性和成员方法后,如果对其“不满意”那么可以进行复写
##调用方式1:
·调用父类成员使用成员变量:父类名.成员变量使用成员方法:父类名.成员方法(self)方式2
·使用super()调用父类成员使用成员变量:super().成员变量使用成员方法:super().成员方法()
三、类型注解
·pycharm自动提示可用方法
·确定传参类型
1、变量的类型注解
##语法(方式1):变量类型注解:
变量:类型var_1:int = 10;
var_2:float = 10.1;
var_3:list = [1,2,3,4];
var_4:tuple = (1,2,3,4);
var_5:set = {1,2,3,4};
var_6:dict = {"a":1,"b":2};
var_7:str = "nihao";详细:
var_8:list[int] = [1,2,3,4];
var_9:tuple[str,bool,int] = ("a",True,1);
var_10:set[int] = {1,2,3};
var_11:dict[str,int]={"age":18};注意:
·元组类型设置类型详细注解,需要将每一个元素都标记出来
·字典类型设置类型详细注解,需要2个类型,第一个是key第二个是value对象类型注解
class Student:pass;stu: Student = Student();
##语法(方式2)
#type: intvar_1 = random.randint(1,10); #type: int
var_2 = json.loads(data); #type: dict[str,int]
var_3 = Student() #type: Student
2、函数的类型注解
##语法
def 函数方法名(形参1:类型,形参2:类型,.....) -> 返回值类型:pass;eg:
def add(x:int,y:int) -> int:return x+y;def func(data:list) -> str:pass;
3、Union类型
##语法:
Union[类型,....,类型]from typing import Union;
my_list: list[Union[str,int]] = [1,2,"hello","world"];
my_dict: dict[str,Union[str,int]] = {"name":"周杰伦","age":18}def func(data:Union[int,str]) -> Union[int,str]:pass;
四、多态
多态,指的是:多种状态,即完成某个行为时,使用不同的对象会得到不同的状态。class Animal:def speak(self):pass;class Dog(Animal):def speak(self):print("旺旺旺");class Cat(Animal):def speak(self):print("喵喵喵");def make_noise(animal:Animal):animal.speak();dog = Dog();
cat = Cat();make_noise(dog);
make_noise(cat);即:
父类做声明(确定有哪些方法,并不具体实现)
子类做实际工作
1.什么是多态?
多态指的是,同一个行为,使用不同的对象获得不同的状态。如,定义函数(方法),通过类型注解声明需要父类对象,实际传入子类对象进行工作,从而获得不同的工作状态2.什么是抽象类(接口)
包含抽象方法的类,称之为抽象类。抽象方法是指:没有具体实现的方法(pass)称之为抽象方法3.抽象类的作用
多用于做顶层设计(设计标准),以便子类做具体实现。
也是对子类的一种软性约束,要求子类必须复写(实现)父类的一些方法
并配合多态使用,获得不同的工作状态