类初始化的参数可以是任何形式

一般情况下,类传入的初始化参数都是 int str 

class BirthDate:
    def __init__(self, year, month, day):
        self.year = year
        self.month = month
        self.day = day

类实例化:

b1 = BirthDate('1995', '1', '27')
print(b1.__dict__)  
# {'year': '1995', 'month': '1', 'day': '27'}

传入的是字符串。

实际上STR本生也是一个一个实例, 所有,类的初始化都可以传入实例

class Teacher:
    def __init__(self, name, gender, birth):
        self.name = name
        self.gender = gender
        self.birth = birth
class BirthDate:
def __init__(self, year, month, day):
self.year = year
self.month = month
self.day = day
 

birth 作为Teacher的一个参数,我们把BirthDate的实例作为实参传给birth

p1 = Teacher('egon', 'male',
             BirthDate('1995', '1', '27'),
                     )
print(p1.__dict__)
{'name': 'egon', 'gender': 'male', 
'birth': <__main__.BirthDate object at 0x0000000001DC6B50>}
print(p1.birth.year,p1.birth.month,p1.birth.day) 
>>>1995 1 27

那么是否可以把其他任何对象都传给形参了, 包括类这个对象? 事实上是可以的

p1 = Teacher('egon', 'male', BirthDate)
print(p1.__dict__)
{
'name': 'egon', 'gender': 'male', 'birth': <class '__main__.BirthDate'>}
p2 = p1.birth('1995', '1', '27')
print(p2.year)
>>>1995

比较一下, 一个是传入类。 一个是传入实例

传入类,还是需要实例化。才能调用被传入者的数据属性和函数属性

所以传入实例比较简单。

还有一个例子, 比较特别

在初始化中,没有对于变量赋值而是,通过self.直接转到函数属性中作判断

class Person:
    def __init__(self, name='None', age=20, sex='male'):
        self.inputname(name)
        self.inputage(age)
        self.inputsex(sex)

    def inputname(self, name):
        if not isinstance(name, str):
            raise Exception('name must be a string')
        self.name = name

    def inputage(self, age):
        if not isinstance(age, int):
            raise Exception('age must be an int')
        self.age = age

    def inputsex(self, sex):
        if not sex in ['male', 'female']:
            raise Exception("sex must be 'male' or 'female'")
        self.sex = sex

    def show(self):
        print(self.name,self.age,self.sex)
p1=Person('alex',100',female')
p1.show()
class Person:
    def __init__(self, inputname, inputage, inputsex):
        self.name =inputname
        self.age = inputage
        self.sex = inputsex

    
    def show(self):
        print(self.name,self.age,self.sex)


def inputname(name=''):
    if not isinstance(name, str):
         raise Exception('name must be a string')
    return name
def inputage(age=20):
    if not isinstance(age, int):
        raise Exception('age must be an int')
    return age

def inputsex(sex='male'):
    if not sex in ['male', 'female']:
        raise Exception("sex must be 'male' or 'female'")
    return  sex


p1=Person(inputname('alex'),inputage(100),inputsex('female'))
p1.show()
原文地址:https://www.cnblogs.com/vincent-sh/p/12779180.html