function showUsers(names) {
    for (const name of names) {
        console.log(name);
    }
}

showUsers(["小林", "中村", "大島"]); 



function showUsers(names, ages, roles) {
    names.forEach((name, index) => {
        age = ages[index];
        role = roles[index];
        console.log(`name=${name}, age=${age}, role=${role}`);
    });
}

showUsers(['小林', '中村', '大島'], [34, 41, 29], ['player', 'manager', 'player']);



class User {
    constructor(name, age, role) {
        this.name = name;
        this.age = age;
        this.role = role;
    }
}

function showUsers(users) {
    for (const user of users) {
        console.log(`name=${user.name}, age=${user.age}, role=${user.role}`);
    }
}

users = [new User("小林", 34, "player"), new User("中村", 41, "manager"), new User("大島", 29, "player")];

showUsers(users);



function showUsers(users) {
    for (const user of users) {
        console.log(`name=${user.name}, age=${user.age}, role=${user.role}`);
    }
}

users = [{name: "小林", age: 34, role: "player"}, {name: "中村", age: 41, role: "manager"}, {name: "大島", age: 29, role: "player"}];

showUsers(users);



console.log(`name=${user.name}, age=${user.age}, role=${user.role}`);



class User {
    constructor(name, age, role) {
        this.name = name;
        this.age = age;
        this.role = role;
    }

    toString() {
        return `name=${this.name}, age=${this.age}, role=${this.role}`;
    }
}

function showUsers(users) {
    for (let user of users) {
        console.log(user.toString())
    }
}

users = [new User("小林", 34, "player"), new User("中村", 41, "manager"), new User("大島", 29, "player")];
showUsers(users);



class User {
    constructor(name) {
        this.name = name
    }
}

const user = new User("中村")
console.log(user.name) 



class User {}



class User {
    name = "名無し";
}

const user = new User();
console.log(user.name); 
user.name = "中村";
console.log(user.name); 



const user = new User();
console.log(user.name); 
user.name = "中村";
console.log(user.name); 

const otherUser = new User();
console.log(otherUser.name); 



class User {
    name = "名無し";
}



class User {
    constructor(name) { this.name = name; }
}

const user = new User("中村");
console.log(user.name); 



class User {
}

const user = new User();
user.name = "中村";
console.log(user.name); 
console.log(user);      



console.log(user); 

const otherUser = new User();
console.log(otherUser.name); 
console.log(otherUser);     



const user = {};
user.name = "中村";
console.log(user.name);



class User {
    static defaultName = "名無し";
    name = User.defaultName;
}

console.log(User.defaultName); 

const user = new User();
console.log(user.name);



User.defaultName = "名前はまだない";

const otherUser = new User();
console.log(user.name); 



class User {
    #realName = "本名";

    showName() {
        console.log(this.#realName);
    }
}

const user = new User();
user.showName(); 

console.log(user.#realName); 



class User {
    static #defaultName = "名無し";
    name = User.#defaultName;
}

console.log(User.#defaultName); 



class User {
    private realName = "本名";
}



const user = new User();
user.realName = 1;



const x = {};
x.realName = 1;
console.log(x); 



class User {
    constructor() {
        console.log("called");
    }
}



new User(); 



class User {
    constructor(name) {
        this.name = name;
    }
}

const user = new User("中村");
console.log(user.name); 



class User {
    setName(name) {
        this.name = name;
    }
}

const user = new User();
user.setName("中村");



class User {
    static defaultName = "名無し";

    static showDefaultName() {
        console.log(this.defaultName);
    }
}

User.showDefaultName(); 



class User {
    #log() {
        console.log("called");
    }

    showLog() {
        this.#log();
    }
}

const user = new User();
user.showLog(); 



class User:
    def __init__(self, name):
        self.name = name


user = User("憲剛")
print(user.name)



class User:
    pass



class User:
    default_name = "名無し"
    def __init__(self, name):
        if name is not None:
            self.name = name
        else:
            self.name = User.default_name


named_user = User("憲剛")
print(named_user.name) 

no_name_user = User(None)
print(no_name_user.name)



class User:
    default_name = "名無し"
    def show_default_name(self):
        print(self.default_name)

    def set_default_name(self, new_name):
        self.default_name = new_name


user = User()
user.show_default_name() 
user.set_default_name("憲剛")
user.show_default_name() 

other_user = User()
other_user.show_default_name() 



class Player:
    scores = []
    def add_score(self, score):
        self.scores.append(score)


player = Player()
print(player.scores) 
player.add_score(1)
print(player.scores) 

other_player = Player()
print(other_player.scores) 



sample1 = {};
sample1.foo = 10;
sample1.foo; 
sample1; 



class Sample:
    def show_foo(self):
        return self.foo


sample1 = Sample()
sample1.foo = 10
sample1.foo 
sample1.show_foo() 

sample2 = Sample()
sample2.foo 
sample2.show_foo 



Sample.baa = 20
Sample.baa 



class User:
    def __init__(self, name):
        self.__name = name


user = User("憲剛")
print(user.__name) 



print(user._User__name) 



class User:
    def __init__(self, name):
        self.name = name


user = User("憲剛")
print(user.name) 



class User:
    def set_name(self, name):
        self.name = name


user = User()
user.set_name("憲剛")
print(user.name) 



user = User()
User.set_name(user, "憲剛")
print(user.name) 



def show_name_fnc(self):
    print(self.name)


user = User()
user.set_name("憲剛")

User.show = show_name_fnc

user.show() 



class User:
    default_name = "名無し"

    @classmethod
    def hello_as_classmethod(cls):
        print(f"hello {cls.default_name}")

    @staticmethod
    def hello_as_staticmethod():
        print(f"hello {User.default_name}")


User.hello_as_classmethod() 
User.hello_as_staticmethod() 



class SpecialUser(User):
    default_name = "特殊な名無し"


SpecialUser.hello_as_classmethod() 
SpecialUser.hello_as_staticmethod() 



from dataclasses import dataclass

@dataclass
class User:
    name: str
    age: int


user = User(name="憲剛", age=41)
user.age 



user = User(name="憲剛", age="何かの文字列")
user.age 



from dataclasses import dataclass

@dataclass(kw_only=True)
class User:
    name: str
    age: int


user = User(name="憲剛", age=41) 
user = User("憲剛", 41) 



from dataclasses import dataclass, KW_ONLY

@dataclass
class User:
    name: str
    _: KW_ONLY
    age: int


user = User("憲剛", age=41) 
user = User("憲剛", 41) 



from dataclasses import dataclass

@dataclass(kw_only=True, frozen=True)
class User:
    name: str
    age: int


user = User(name="憲剛", age=41)
user.age = 0 



from dataclasses import dataclass
from typing import List

@dataclass(kw_only=True, frozen=True)
class User:
    items: List[str]


user = User(items=[])
user.items 
user.items.append("book")
user.items 



from dataclasses import dataclass, replace

@dataclass(kw_only=True, frozen=True)
class User:
    name: str
    age: int


user = User(name="憲剛", age=41)
new_user = replace(user, age=14)
new_user.age 
user.age 



from dataclasses import dataclass

@dataclass(kw_only=True, frozen=True)
class User:
    age: int
    name: str = "名無し"


user = User(age=41)
user.name 



from dataclasses import dataclass

@dataclass(kw_only=True, frozen=True)
class User:
    name: str = "名無し"
    age: int 



from dataclasses import dataclass

@dataclass(kw_only=True, frozen=True)
class User:
    age: int
    name: str = "名無し"


User.name 
User.age 



from dataclasses import dataclass
from typing import List

@dataclass(kw_only=True, frozen=True)
class User:
    items: List[str] = [] 



from dataclasses import dataclass, field
from typing import List

@dataclass(kw_only=True, frozen=True)
class User:
    items: List[str] = field(default_factory=list)


user = User()
user.items 
user.items.append("book")
user.items 



from dataclasses import dataclass
from typing import ClassVar

@dataclass(kw_only=True, frozen=True)
class Sample:
    clzz_var: ClassVar[str] = "foo"


Sample.clzz_var 
Sample(clzz_var="hoge") 


